583. 两个字符串的删除操作 - 力扣(LeetCode)
状态:查看思路后AC。
和查找子序列的操作类似,但是考虑的是删除操作。代码如下:
class Solution {
public:int minDistance(string word1, string word2) {int len1 = word1.size(), len2 = word2.size();vector<vector<int>> dp(len1+1, vector<int>(len2+1, 0));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] = min(dp[i-1][j]+1, dp[i][j-1]+1);}}return dp[len1][len2];}
};
72. 编辑距离 - 力扣(LeetCode)
状态:查看思路后AC。
综合了前面几题,在不同的情况下要考虑增、删、改三种情况,对于多个数的求min技巧get(min({num1, num2, num3});),代码如下:
class Solution {
public:int minDistance(string word1, string word2) {int len1 = word1.size(), len2 = word2.size();vector<vector<int>> dp(len1+1, vector<int>(len2+1, 0));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] = min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]})+1;}}return dp[len1][len2];}
};