题目:583. 两个字符串的删除操作
文章链接:代码随想录
题目链接:力扣题目链接
图释:
class Solution {
public:
int minDistance(string word1, string word2) {
// dp数组的含义:以i-1为结尾的word1,与以j-1为结尾的word2相等,所需要删除的最小步数
// 分两种情况:word1[i-1]==word2[j-1] word1[i-1]!=word2[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 删除word1
// dp[i][j]=dp[i][j-1]+1 删除word2
// dp[i][j]=dp[i-1][j-1]+2 删除word1和word2
// 初始化:dp[i][0]和dp[0][j]都要初始化,并且当word1为0时,要删除的word2步数为字符串长度
vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1, 0));
for(int i=1; i<=word1.size(); i++) dp[i][0]=i;
for(int j=1; 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{
dp[i][j]=min(dp[i-1][j]+1, min(dp[i][j-1]+1,dp[i][j]=dp[i-1][j-1]+2));//取最小值
}
}
}
return dp[word1.size()][word2.size()];
}
};
// 只要求出两个字符串的最长公共子序列长度即可
// 除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。
class Solution {
public:
int minDistance(string word1, string word2) {
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. 编辑距离
文章链接:代码随想录
视频链接:LeetCode:72.编辑距离
题目链接:力扣题目链接
图释:
class Solution {
public:
int minDistance(string word1, string word2) {
// dp[i][j]数组的含义:以i-1结尾的word1转换成以j-1结尾的word2,所需要最少的操作数
// 分两种情况:word1[i-1]==word2[j-1] word1[i-1]!=word2[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 删除word1 增加与删除操作时逆向的
// dp[i][j]=dp[i][j-1]+1 删除word2
// dp[i][j]=dp[i-1][j-1]+1 将word1[i-1]成跟word2[j-1]相同的数
// 初始化:dp[i][0]和dp[0][j]都要初始化,并且当word1为0时,要删除的word2步数为字符串长度
vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1,0));
for(int i=1; i<=word1.size(); i++) dp[i][0]=i;
for(int j=1; 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{
dp[i][j]=min(dp[i-1][j]+1, dp[i][j-1]+1);//取最小值
}
}
}
return dp[word1.size()][word2.size()];
}
};
题目:编辑距离总结篇
文章链接:代码随想录