代码随想录Day59 | 583. 两个字符串的删除操作 72. 编辑距离
583.两个字符串的删除操作
文档讲解:代码随想录
视频讲解: LeetCode:583.两个字符串的删除操作
状态
- dp数组
dp[i][j] 表示 word1中的子串word1[0]到word1[i-1] 和 word2中的子串word2[0]到word2[j-1]相同时所需要的删除最少步数 - 递推公式
当 word1[i-1] == word2[j-1] 时 那么就说明该元素可以不用删除,dp[i][j]的结果就和dp[i-1][j-1]的结果相同
当不相等时,可能是删除word1[i-1],可能是删除word2[j-1],也可能两个都删除。
删除word1[i-1] dp[i][j] = dp[i-1][j]+1
删除word2[j-1] dp[i][j] = dp[i][j-1]+1
两个都删除 dp[i][j] = dp[i-1][j-1]+2
然后取三者的最小值 - 初始化
当word1或者word2为空字符串时进行初始化 - 遍历顺序
从前向后 - 打印dp
c++
//dp[i][j]表示s中0-i-1 与 t中0-j-1 进行删除操作后相同的最少步骤
//当s[i-1] == t[j-1] dp[i][j] = dp[i-1][j-1]
//当不相等时 就要考虑删除i-1 dp[i-1][j] 删除j-1 dp[i][j-1]的最小值+1
//以及同时删除i-1 和 j-1 dp[i-1][j-1]+2
//而 dp[i-1][j]+1 = dp[i-1][j-1]+2 相当于先删除i-1 然后在基础上再删除j-1
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
//初始化 当 s或者t的字符串长度为0时
for(int i = 0;i<word1.size()+1;i++)
{
dp[i][0] = i;
}
for(int i = 0;i<word2.size()+1;i++)
{
dp[0][i] = i;
}
for(int i = 1;i<word1.size()+1;i++)
{
for(int j = 1;j<word2.size()+1;j++)
{
if(word1[i-1] == word2[j-1])
{
dp[i][j] = dp[i-1][j-1];
}
else
{
dp[i][j] = min(dp[i][j-1],dp[i-1][j])+1;
}
}
}
return dp[word1.size()][word2.size()];
}
};
72.编辑距离
文档讲解:代码随想录
视频讲解: 动态规划终极绝杀! LeetCode:72.编辑距离
状态
本题和上一题差不多,只是现在只能在一个字符穿上进行修改,我们考虑在字符串上的添加操作,比如在word1上添加一个word2的字符使得两个字符串相等,其实就是从word2上删除掉该字符就可以了,所以可以转换为上面一道题
- dp数组
dp[i][j] 表示 word1中的子串word1[0]到word1[i-1] 转换 word2中的子串word2[0]到word2[j-1],所需要的最少步数 - 递推公式
当word1[i-1] == word2[j-1] 那么说明不需要任何操作 dp[i][j] = dp[i-1][j-1]
当不相等时,有三种操作方式
添加 相当于删除word2的j-1 dp[i][j] = dp[i][j-1]+1
删除 删除word1的i-1 dp[i][j] = dp[i-1][j]+1
替换 相当于将word1的i-1 替换为 word2的j-1 dp[i][j] = dp[i-1][j-1]+1
取三者最小值 - 初始化
当word1或者word2为空字符串时进行初始化 - 遍历顺序
从前向后 - 打印dp
c++
//dp[i][j] 表示 s子串0-i-1 转换为 t子串0-j-1的最少操作数
//如果s[i-1] == t[j-1] 那么dp[i][j] = dp[i-1][j-1]
//如果不相等 就需要涉及到
//插入 在s的i-1位置插入t[j-1] dp[i][j-1]
//删除 删除s的i-1位置 dp[i-1][j]+1
//替换 直接替换s[i-1]为t[j-1] dp[i-1][j-1]+1
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()+1;i++)
{
dp[i][0] = i;
}
for(int i = 0;i<word2.size()+1;i++)
{
dp[0][i] = i;
}
for(int i = 1;i<word1.size()+1;i++)
{
for(int j = 1;j<word2.size()+1;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],dp[i-1][j]))+1;
}
}
}
return dp[word1.size()][word2.size()];
}
};
<>
文档讲解:代码随想录
视频讲解: <>
状态