本文最后更新于592 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
https://programmercarl.com/0072.%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB.html
1.在做过前面所以为该题做基础的题之后,理解起来就简单多了,本题增加元素和删除元素本质上是一样的,操作数都是相同的,就是说word1删除元素其实和word2增加元素的操作是相同的,所以本题只需要考虑删除和替换元素的操作如何迭代即可,本题的dp数组的含义为:dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。迭代公式是两数相同时不需要做操作,所以返回上一层的子结果,两数不相同是进行删除和替换的操作,每次操作取两数的最小值即可。编辑距离的问题还需要二刷的时候再重新厘清一下思路。
CPP
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
for(int i = 0; i <= word1.size(); i++){
dp[i][0] = i;
}
for(int j = 0; j <= word2.size(); j++){
dp[0][j] = j;
}
for(int i = 1; i <= word1.size(); i++){
for(int j = 1; j <= word2.size(); j++){
if(word1[i - 1] == word2[j - 1]){
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1));
}
}
}
return dp[word1.size()][word2.size()];
}
};