题目来源:https://leetcode.cn/problems/edit-distance/description/
C++题解:动态规划
dp[i][j] 表示 word1[i-1]转换成word2[j-1]所使用的最少操作数
当word1[i - 1] 与 word2[j - 1]相等时,不需要进行任何操作
当word1[i - 1] 与 word2[j - 1]不相等时,需要进行增删或者替换。增跟删本质上是一样的,对一个字符串增加就相当于另一个字符串删除,所以是对 dp[i][j-1] 或者 dp[i-1][j] 操作。而替换就相当于使 word1[i - 1] 与 word2[j - 1]相等,所以是对 dp[i-1][j-1] 操作。即 dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;
class Solution {
public:
int minDistance(string word1, string word2) {
int n1 = word1.size(), n2 = word2.size();
// word1[i-1]转换成word2[j-1]所使用的最少操作数为dp[i][j]
vector<vector<int>> dp(n1+1, vector<int>(n2+1, 0));
// 初始化
for(int m = 0; m <= n1; m++) {
dp[m][0] = m;
}
for(int m = 0; m <= n2; m++) {
dp[0][m] = m;
}
// 动态规划
for(int i = 1; i <= n1; i++) {
for(int j = 1; j <= n2; j++) {
// 当相等时,不需要增加操作数
if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];
// 当不相等时,dp[i-1][j-1] + 1表示替换操作,另外两个分别为增加和删除操作
else dp[i][j] = min( min(dp[i][j-1] + 1, dp[i-1][j] + 1), dp[i-1][j-1] + 1);
}
}
return dp[n1][n2];
}
};