LeetCode583:两个字符串的删除操作
题目链接:583. 两个字符串的删除操作 - 力扣(LeetCode)
代码如下:
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));
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
{
dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 2);
}
}
}
return dp[word1.size()][word2.size()];
}
};
dp的含义:以i-1的word1和j-1的word2两个字符串删除使得相同的最小步数
这里的i-1和j-1是为了方便后续的初始化。
dp的递推公式
if(word1[i - 1] == word2[j - 1])
{
dp[i][j] = dp[i - 1][j - 1];
}
else
{
dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 2);
}
这个其实还是这么判断嘛,这两个相同的话,那么就直接让两个字符串往前走即可,这个时候不需要删除,如果不相同的话,那么这个时候,第一种情况就是word1串删除,也就是dp[i - 1][j] + 1,第二种情况是dp[i][j - 1] + 1的操作,第三种就是这两个都执行删除操作,然后加上2,又因为是求最小的步数嘛,所以就需要这三个最小值即可
初始化:这个初始化其实是需要在dp[i][0]初始化成i,在dp[0][j]初始化成j,因为dp[i][j]这个需要我们有初始化的值,才能往后进行推导
遍历顺序:
这个题目仍然可以通过由左到右,由上到下可以推导出来这个dp,那么遍历顺序就直接按照正常即可
返回值:这个题目返回值仍然是两个各自的字符串长度。