您的位置:首页 > 其它

行编辑距离Edit Distance——动态规划

2015-06-06 11:29 281 查看

题目描述:

给定一个源串和目标串,能够对源串进行如下操作:

1. 在给定位置上插入一个字符

2. 替换任意字符

3. 删除任意字符

写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。

思路:

设状态dp[i][j] 表示从源串s[0...i] 和 目标串t[0...j] 的最短编辑距离

边界为:dp[i][0] = i,dp[0][j] = j

递推方程:

如果s[i] == t[j], 那么 dp[i][j] = dp[i-1][j-1]
如果s[i] != t[j],那么有三种操作情况:

将s[i]删除,dp[i][j] = dp[i-1][j] + 1;
将s中添加t[j],dp[i][j] = dp[i][j-1] +1;
将s和t进行替换,dp[i][j] = dp[i-1][j-1] +1;

因此,可以写出状态转移方程:
dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1] + (s[i]==t[j] ? 0 :1))
分别对应:删除、添加、替换(若相等就不替换)

代码:

class Solution {
public:
int minDistance(string word1, string word2) {
int Slen = word1.size();
int Tlen = word2.size();
int dp[Slen+1][Tlen+1] = {0};//注意:这里都+1,并且初始化为0
//长度为n的字符串有n+1个隔板
for(int i=1; i<=Slen; i++)  //注意从1开始
dp[i][0] = i;
for(int j=1; j<=Tlen; j++)
dp[0][j] = j;
for(int i=1; i<=Slen; i++)
{
for(int j=1; j<=Tlen; j++)
{
if(word1[i-1] == word2[j-1])
dp[i][j] = dp[i-1][j-1];
else
{
int temp = min(dp[i-1][j], dp[i][j-1]);
dp[i][j] = min(temp, dp[i-1][j-1]) + 1;
}
}
}
return dp[Slen][Tlen];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: