昨天学习编辑距离算法,官方的状态转移方程是;
i==0 ... j==0 ....
当i>=1 && j>=1 dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]]+str1[i]==str2[j]?0:1);
我又在想, 这样的状态方程是否也正确呢?
当 i>=1 && j>=1
if(str1[i]==str2[j]) dp[i][j]=dp[i-1][j-1];
else dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]]+1);
我自己证明不了,就拿去试着去oj测试了,结果是ac了,可是这个方程对吗?
我自己修改的编辑距离转移方程:
if(str1[i]==str2[j]) dp[i][j]=dp[i-1][j-1];
else dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]]+1);
我认为 这个转移方程也是对的,原因如下:
假设上述方程成立,则 当str[i]==str2[j]时,dp[i-1][j-1] 一定 小于 dp[i-1][j-1]+1; √ 无需证明
所以只需要证明2个 ①dp[i-1][j-1] 一定<= dp[i-1][j] +1 且 ②dp[i-1][j-1] 一定<= dp[i][j-1] +1
使用 反证法证明①:
假设 存在 dp[i-1][j-1] > dp[i-1][j]+1 ,也就是 dp[i-1][j-1] - dp[i-1][j] > 1 ;
但这是不可能的,为什么?因为dp[i-1][j-1]加上str2j就可以跟dp[i-1][j]相等了,最多需要一步。所以 dp[i-1][j-1] - dp[i-1][j] > 1 ; 这是不可能的。
所以 dp[i-1][j-1] 一定<= dp[i-1][j] +1 ; ①成立
同理可证 ②dp[i-1][j-1] 一定<= dp[i][j-1] +1 成立。
所以
当 i>=1 && j>=1
if(str1[i]==str2[j]) dp[i][j]=dp[i-1][j-1];
else dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]]+1);
这个转移也是对的。如果有错误,请指正。
如果任意一个点的右边或下边或者右下边的值比在这个点大的话,这个是没问题的;否则,反之。