538.两个字符串的删除操作
思路一:
- 1.dp存储:以word1i-1结尾,word2j-1结尾,最少进行dpij次操作
- 2.动态转移方程: if(word1i-1==word2i-1) dpij=dpi-1j-1;
- else dpij=min(dpi-1j+1,dpij-1+1)
- 3.初始化:dpi0=i dp0j=j
- 4.遍历顺序:1~尾巴
cpp
class Solution {
public:
int minDistance(string word1, string word2) {
int n=word1.size(),m=word2.size();
vector<vector<int>>dp(n+1,vector<int>(m+1,0));
for(int i=0;i<=n;i++) dp[i][0]=i;//相同时需要删除所有字符串
for(int j=0;j<=m;j++) dp[0][j]=j;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;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[n][m];
}
};
72.编辑距离
思路:
- 1.dp存储:以word1i结尾,word2j结尾,使两个字符串相同的最小操作次数
- 2.动态转移方程: if(word1i-1==word2j-1) dpij=dpi-1j-1;
- else dpij=min(dpi-1j-1+1,min(dpi-1j+1,dpij-1+1)
- 3.初始化:dpi0=i dp0j=j
- 4.遍历顺序:1~n 1~m
cpp
class Solution {
public:
int minDistance(string word1, string word2) {
int n=word1.size(),m=word2.size();
vector<vector<int>>dp(n+1,vector<int>(m+1,0));
for(int i=0;i<=n;i++) dp[i][0]=i;
for(int j=0;j<=m;j++) dp[0][j]=j;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){//添加和删除都是一样的,两边各添加和删除;改变就是上一次的值+1
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]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));
}
}
return dp[n][m];
}
};