Day56_动态规划
49. 两个字符串的删除操作
583. 两个字符串的删除操作
思路:
dp[i][j]
表示word1[0~i-1]
与word2[0~j-1]
相同需要删除的最少次数- 递推公式:
word1[i - 1] == word2[j - 1]
时,dp[i][j] == dp[i - 1][j - 1]
word1[i - 1] != word2[j - 1]
时,dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+2)
- 初始化,
dp[i][0] = i
,dp[0][j] = j
全部删掉才能满足相同- 从左上到右下依次遍历
class Solution {
public:
int minDistance(string word1, string word2) {
int len1 = word1.length();
int len2 = word2.length();
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]+2, min(dp[i-1][j], dp[i][j-1])+1);
}
}
return dp[len1][len2];
}
};
50. 编辑距离
72. 编辑距离
思路:
dp[i][j]
表示word[0~i-1]
与word[0~j-1]
的最小编辑距离- 递推公式
word1[i - 1] == word2[j - 1]
时,dp[i][j] == dp[i - 1][j - 1]
word1[i - 1] != word2[j - 1]
时,
- 增:
dp[i][j] = dp[i-1][j]+1
- 删:
dp[i][j] = dp[i][j-1]+1
- 替换:
dp[i][j] = dp[i-1][j-1] + 1
- 初始化
dp[i][0] = i
,dp[0][j] = j
全部删掉才能满足相同- dp顺序,从左上到右下
class Solution {
public:
int minDistance(string word1, string word2) {
int len1 = word1.length();
int len2 = word2.length();
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], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
}
}
return dp[len1][len2];
}
};