一、题目描述
二、思路
(1)确定状态dp[i][j]
表示word1中前i
个单词,变换到word2中前j
个字符,最少需要的动作次数。
(2)状态转移方程
编辑距离可以通过以下三种操作进行计算:插入一个字符、删除一个字符、替换一个字符。因此,可以使用以下状态转移方程:
- 如果
A[i] == B[j]
,那么dp[i][j] = dp[i - 1][j - 1]
:即两个当前位置的字符都相同,两种状态的编辑距离都是相等的。 - 否则,
p[i][j] = min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]) + 1
(实际代码中要用两个min嵌套哦),即取了替换、增加、删除操作编辑距离的最小值,这三种情况和当前情况编辑距离相差1,这个1就是指三种动作各执行1次所能带动的状态转移。
(3)边界+初始条件
边界:如果word1和word2其中一个没字母,即dp[0][j]
和dp[i][0]
是边界情况,值分别为j
和i
,即一路加到底和一路减到底。
初始条件:也只有两个字符串都相同或者都是空时编辑距离才为0,先全都将dp
赋值为0好了。文章来源:https://www.toymoban.com/news/detail-655954.html
(4)计算顺序
根据状态转移方程,下标大的dp值都能从下标小的dp值计算得到,所以i
和j
都是从小到大遍历。文章来源地址https://www.toymoban.com/news/detail-655954.html
三、C++代码
class Solution {
public:
int minDistance(string word1, string word2) {
int n = word1.size();
int m = word2.size();
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
for(int i = 0; i <= n; i++){
dp[i][0] = i;
}
for(int j = 0; j <= m; j++){
dp[0][j] = j;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(word1[i - 1] == word2[j - 1]){
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = min(min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
}
}
}
return dp[n][m];
}
};
到了这里,关于【Leetcode72】编辑距离(动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!