DP操作建模
dp[i][j]代表字符串word1[0...i-1]与word2[0...j-1]的最小编辑距离。
对于编辑距离的三个操作来说:
插入举例:X:=ex VS Y:=exp
前面的两个ex都是相同,则编辑距离不变为0,X没有第三个字符,这里如果我们插入了一个字符即可。dp[i][j]=dp[i][j-1]+1;
删除举例: X:= exp VS Y:= ex
我故意用了这个例子,也就是说插入和删除是互逆的,就是看我们以谁为对象来看待这个问题。dp[i][j]=dp[i-1][j]+1;
替代举例: X:= sitten VS Y:=sitting
这里例子的第五个字符需要替代,为什么要替代呢? 因为第四个字符和第六个字符相同(这里就需要用DP,也就是说,需要一个空间来记录之前的比较结果和之后的比较结果)。
class Solution { public: int minDistance(string word1, string word2) { int size1 = word1.size(), size2 = word2.size(); vector<vector<int>> dp(size1 + 1, vector<int>(size2 + 1, 0)); for (int i = 0; i <= size1; i++) dp[i][0] = i; for (int j = 0; j <= size2; j++) dp[0][j] = j; for (int i = 1; i <= size1; i++) { for (int j = 1; j <= size2; j++) { int replace = word1[i - 1] == word2[j - 1] ? dp[i - 1][j - 1] : dp[i - 1][j - 1] + 1; int ins_del = min(dp[i][j - 1], dp[i - 1][j]) + 1; dp[i][j] = min(replace, ins_del); } } return dp.back().back(); } };