您现在的位置是:首页 >技术教程 >代码随想录算法训练营第四十五天-动态规划-子序列-72. 编辑距离网站首页技术教程
代码随想录算法训练营第四十五天-动态规划-子序列-72. 编辑距离
简介代码随想录算法训练营第四十五天-动态规划-子序列-72. 编辑距离
- 此题是动态规划所能解决的最经典题目
- 动规五部曲
dp[i][j]
表示以i - 1
的word1
和以j - 1
的word2
变为相同的最少操作次数- 递推公式:
if word1[i - 1] == word2[j - 1] {dp[i][j] = dp[i - 1][j - 1];}
else
会有三种操作:增、删、替换- 增与删(两者是一致的,这两种操作互逆):
d[i - 1][j] + 1
、dp[i][j - 1] + 1
- 替换:
dp[i - 1][j - 1] + 1
- 增与删(两者是一致的,这两种操作互逆):
- 初始化:和上一题一致
- 递推过程
- 打印
class Solution {
public:
int minDistance(string word1, string word2) {
int len1 = word1.size(), len2 = word2.size();
std::vector<std::vector<int>> dp(len1 + 1, std::vector<int>(len2 + 1));
for (int i = 0; i <= len1; ++i)
dp[i][0] = i;
for (int j = 0; j <= len2; ++j)
dp[0][j] = j;
for (int i = 1; i <= len1; ++i) {
for (int j = 1; j <= len2; ++j) {
if (word1[i - 1] == word2[j - 1])
dp[i][j] = dp[i - 1][j - 1];
else {
dp[i][j] = std::min(dp[i - 1][j - 1] + 1, std::min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
}
}
}
return dp[len1][len2];
}
};
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。