给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
1、dp[i][j]:以word1[i-1]字符结尾,word2[j-1]字符结尾的两个字符串找到相同所需的最小步数
2、if word1[i-1]==word2[j-1]
dp[i][j]=dp[i-1][j-1],即此时啥都不用做,直接等于word1[i-2]和word2[j-2]找到相同子序列所需的最小步数就行
else
i、在word1[i-1]与word2[j-2]的基础上删除word2[j-1]
ii、在word1[i-2]与word2[j-1]的基础上删除word2[j-1]
iii、在word1[i-2]与word2[j-2]的基础上删除word1[i-1],word2[j-1]
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2)
3、初始化
dp[0][j]=j
dp[i][0]=i
4、外层遍历word1,内层遍历word2
5、模拟
代码如下:
int deleteSubSequence(string s, string t){vector>dp(s.size() + 1, vector(t.size() + 1, 0));for (int j=0;j<=t.size();j++){dp[0][j] = j;}for (int i=0;i<=s.size();i++){dp[i][0] = i;}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(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 2);}}}return dp[s.size()][t.size()];}
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
示例 1: 输入:word1 = “horse”, word2 = “ros” 输出:3 解释: horse -> rorse (将 ‘h’ 替换为 ‘r’) rorse -> rose (删除 ‘r’) rose -> ros (删除 ‘e’)
示例 2: 输入:word1 = “intention”, word2 = “execution” 输出:5 解释: intention -> inention (删除 ‘t’) inention -> enention (将 ‘i’ 替换为 ‘e’) enention -> exention (将 ‘n’ 替换为 ‘x’) exention -> exection (将 ‘n’ 替换为 ‘c’) exection -> execution (插入 ‘u’)
1、dp[i][j]:以word1[i-1]字符结尾,word2[j-1]字符结尾的两个字符串,将word1转换为word2的最小步骤
2、if word1[i-1]==word2[j-1]
dp[i][j]=dp[i-1][j-1],即此时啥都不用做,等于由word1[i-2]转换为word2[j-2]的步数就行
else
i、在word1[i-1]与word2[j-2]的基础上删除word2[j-1],相当于在word1中增加字符
ii、在word1[i-2]与word2[j-1]的基础上删除word2[j-1]
iii、在word1[i-2]与word2[j-2]的基础上将word1[i-1]替换为word2[j-1]
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1)
3、初始化
dp[0][j]=j
dp[i][0]=i
4、外层遍历word1,内层遍历word2
5、模拟
代码如下:
int editeDistance(string s, string t){vector>dp(s.size() + 1, vector(t.size() + 1, 0));for (int j=0;j<=t.size();j++){dp[0][j] = j;}for (int i=0;i<=s.size();i++){dp[i][0] = i;}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{int tmp = min(dp[i][j - 1] + 1, dp[i - 1][j] + 1);dp[i][j] = min(dp[i - 1][j - 1] + 1, tmp);}}}return dp[s.size()][t.size()];}