给定两个单词 word1
和 word2
,返回使得 word1
和 word2
相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
示例 1:
输入: word1 = "sea", word2 = "eat" 输出: 2 解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"
示例 2:
输入:word1 = "leetcode", word2 = "etco" 输出:4
提示:
1 <= word1.length, word2.length <= 500
word1
和word2
只包含小写英文字母
Solution:
一、DP定义
删除操作就是考不考虑
dp[i][j]:[0- i-1]区间的s字符串 和 [0- j-1]区间的t字符串 相同 最少需要需要操作dp[i][j]次
二、递推关系
s[i-1] == t[j-1]:不需要操作,最少操作次数和上一个状态,即各不加目前的字母一样。dp[i][j] = dp[i-1][j-1];
s[i-1] != t[j-1]:需要进行操作,有两个来源。
1、操作s字符串,不加s[i-1],看之前需要操作几次,相当于就是删掉s[i-1];dp[i][j] = dp[i-1][j];
2、操作t字符串。不加t[i-1]这个字符,看之前需要操作几次=s[j-1],相当于就是删除t[j-1];dp[i][j] = dp[i][j-1];
不相等情况 有两个来源,需要取min(1,2);
三、初始化:
dp[i][j]的状态由 [i-1],[j-1],[i-1][j],[i][j-1]得来。所以得对第一行和第一列进行初始化。
class Solution {
public:
int minDistance(string s, string t) {
//删除操作就是考不考虑
//dp[i][j]:[0- i-1]区间的s字符串 和 [0- j-1]区间的t字符串 相同 最少需要需要操作dp[i][j]次
vector<vector<int>>dp(s.size()+1,vector<int>(t.size()+1,0));
for(int i = 0;i <= s.size();i++){
dp[i][0] = i;//s中有几个,就删除几个,变为空字符串
}
for(int j = 0;j <= t.size();j++){
dp[0][j] = j;
}
for(int i = 1;i <= s.size();i++){
for(int j = 1;j <= t.size();j++){
if(s[i-1] == t[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[s.size()][t.size()];
}
};