题目链接:Edit Distance
题目大意:求解两个字符串的编辑距离。将一个字符串变为另一个字符串所需要进行的最小编辑动作,这里的编辑动作包括插入、删除、字符替换。
一.算法设计
这是一道经典的动态规划问题,两个字符串的对齐方式很多,如果要将所有的对齐方式都考虑一遍,算法的效率将十分低下。分解子问题的办法是看两个字符串的前缀,现令E[i,j]表示字符串x与字符串y的相应前缀的编辑距离,则E[n,m]就是所求的答案。
对于三种编辑操作的变化,对于E[i-1,j-1]即前一个进行操作
- 插入:E[i,j-1]+1
- 删除:E[i-1,j]+1
- 替换:E[i-1,j-1] + diff(i,j), 其中diff(i,j)为下一字符是否相同,若相同返回0,若不相同表示需要操作返回1.
二.算法实现
算法的实现很简单,不过要注意数组下标的变化。由于string的下标是从0开始,故在判断diff(i,j)的时候是对i-1,j-1进行判断。注意E[i,j]是从1开始进行计算。
class Solution {
public:
int minDistance(string word1, string word2) {
int E[1000][1000];
int n = word1.size();
int m = word2.size();
for(int i = 0; i <= n; i++){
E[i][0] = i;
}
for(int j = 1; j <= m; j++){
E[0][j] = j;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
int cost = word1[i-1] == word2[j-1]?0:1;
E[i][j] = min(min(E[i-1][j]+1,E[i][j-1]+1), E[i-1][j-1]+cost);
}
}
return E[n][m];
}
};