动态规划 part 16
动态规划
● 583. 两个字符串的删除操作
● 72. 编辑距离
583. 两个字符串的删除操作
法1:动态规划
int minDistance(string word1, string word2) {
/* vector<vector<int>>dp(word1.size() + 1,vector<int>(word2.size() + 1,0));
for (int i = 0; i <= word1.size(); ++i) {
dp[i][0] = i;
}
for (int j = 0; j <= word2.size(); ++j) {
dp[0][j] = j;
}
for (int i = 1; i <= word1.size(); ++i) {
for (int j = 1; j <= word2.size(); ++j) {
if (word1[i - 1] == word2[j - 1])dp[i][j] = dp[i - 1][j - 1];
else{
// 就是 当 同时删word1[i - 1]和word2[j - 1],
// dp[i][j-1] 本来就不考虑 word2[j - 1]了,那么我在删 word1[i - 1],
// 是不是就达到两个元素都删除的效果,即 dp[i][j-1] + 1
dp[i][j] = min(dp[i][j - 1] + 1,dp[i - 1][j] + 1);
}
}
}
return dp[word1.size()][word2.size()];*/
//法2:最长公共子序列
vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1, 0));
for (int i=1; i<=word1.size(); i++){
for (int j=1; j<=word2.size(); j++){
if (word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
return word1.size()+word2.size()-dp[word1.size()][word2.size()]*2;
}
72. 编辑距离
72. 编辑距离
法1:动态规划
int minDistance(string word1, string word2) {
vector<vector<int>>dp(word1.size() + 1,vector<int>(word2.size() + 1,0));
for (int i = 0; i <= word1.size(); ++i) dp[i][0] =i;
for (int i = 0; i <= word2.size(); ++i) dp[0][i] =i;
for (int i = 1; i <= word1.size(); ++i) {
for (int j = 1; j <= word2.size(); ++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 - 1][j], dp[i][j - 1]}) + 1;
}
}
}
return dp[word1.size()][word2.size()];
}