动态规划五部曲:
1、确定dp数组及其下标含义
dp[i][j]:以i-1为结尾的字符串word1,和以j-1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数
2、确定递推式
当word1[i-1]和word[j-1]相同的时候
dp[i][j] = dp[i-1][j-1];
当word[i-1]==word[j-1]不相同的时候,有三种情况
情况1:删除word1[i-1] dp[i][j] = dp[i-1][j]+1;
情况2:删除word2[j-1] dp[i][j] = dp[i][j-1]+1;
情况3:同时删word1[i-1]和word2[j-1],操作的最少次数为dp[i-1][j-1]+2
取最小
3、初始化
初始化dp[i][0]和dp[0][j],当有一个字符串长度为0时,另一个字符串一直删字符即可,所以dp[i][0] = i;dp[0][j] = j;
for(int i = 0;i<=word1.size();i++){
dp[i][0] = i;
}
for(int j = 0;j<=word2.size();j++){
dp[0][j] = j;
}
4、确定遍历顺序
从前往后
5、举例推导dp数组
"sea"
"eat"
dp数组:
0 1 2 3
1 2 3 4
2 1 2 3
3 2 1 2
题解:
class Solution {
public:
int minDistance(string word1, string word2) {
//dp[i][j]:以i-1为结尾的字符串word1,和以j-1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数
//确定递推公式
//当word1[i-1]和word[j-1]相同的时候
//dp[i][j] = dp[i-1][j-1];
//当word[i-1]==word[j-1]不相同的时候,有三种情况
//情况1:删除word1[i-1] dp[i][j] = dp[i-1][j]+1;
//情况2:删除word2[j-1] dp[i][j] = dp[i][j-1]+1;
//情况3:同时删word1[i-1]和word2[j-1],操作的最少次数为dp[i-1][j-1]+2
//取最小
//定义dp数组
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;
}
//计算dp数组
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-1][j-1]+2));
}
}
}
return dp[word1.size()][word2.size()];
}
};