公众号 链接wordpress,网站seo快速排名,南昌网站排名优化报,高端网页设计培训583. 两个字符串的删除操作
给定两个单词 word1 和 word2 #xff0c;返回使得 word1 和 word2 相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。 示例 1#xff1a;
输入: word1 sea, word2 eat
输出: 2
解释: 第一步将 返回使得 word1 和 word2 相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。 示例 1
输入: word1 sea, word2 eat
输出: 2
解释: 第一步将 sea 变为 ea 第二步将 eat 变为 ea示例 2:
输入word1 leetcode, word2 etco
输出4
思路
动态规划1
定义dp[i][j]以i-1为结尾的字符串word1和以j-1位结尾的字符串word2想要达到相等所需要删除元素的最少次数。
递推:
还是分为当前相等/不相等 相等则dp[i][j] dp[i - 1][j - 1];(不需要删除,次数不涨) 当word1[i - 1] 与 word2[j - 1]不相同的时候有三种情况
情况一删word1[i - 1]最少操作次数为dp[i - 1][j] 1(这里的1是删除i-1)
情况二删word2[j - 1]最少操作次数为dp[i][j - 1] 1(这里的1是删除j-1)
情况三同时删word1[i - 1]和word2[j - 1]操作的最少次数为dp[i - 1][j - 1] 2
初始化: 按照dp定义 首列初始化为列下标 首行初始化为行下标
动态规划2
求两字符串的最大公共子序列的长度, 然后用字符串长度去减
那么求最大公共子序列:
定义:dp[i][j] 表示以0 到 i-1为的字符串word1和以 0 到 j-1位的字符串word2两字符串的最长公共子序列长度
递推:
如果text1[i - 1] 与 text2[j - 1]相同那么找到了一个公共元素所以dp[i][j] dp[i - 1][j - 1] 1;
如果text1[i - 1] 与 text2[j - 1]不相同那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列取最大的。
初始化:按照dp定义 全0即可
代码
动态规划1
class Solution {public int minDistance(String word1, String word2) {//dp[i][j]以i-1为结尾的字符串word1和以j-1位结尾的字符串word2想要达到相等所需要删除元素的最少次数。int [][] dp new int [word1.length()1][word2.length()1];for(int i 0; i word1.length(); i){dp[i][0] i;}for(int j 0; j word2.length(); j){dp[0][j] j;}for(int i 1; i word1.length();i){for(int j 1; jword2.length(); j){if(word1.charAt(i-1) word2.charAt(j-1)){dp[i][j] dp[i-1][j-1];}else{//dp[i][j - 1] 1 dp[i - 1][j - 1] 2dp[i][j] Math.min(dp[i][j-1] 1, dp[i-1][j] 1);}}}return dp[word1.length()][word2.length()];}
}
动态规划2
class Solution {public int minDistance(String word1, String word2) {//dp[i][j] 表示以0 到 i-1为的字符串word1和以 0 到 j-1位的字符串word2两字符串的最长公共子序列长度int [][] dp new int [word1.length()1][word2.length()1];for(int i 1; i word1.length();i){for(int j 1; jword2.length(); j){if(word1.charAt(i-1) word2.charAt(j-1)){dp[i][j] dp[i-1][j-1] 1;}else{dp[i][j] Math.max(dp[i-1][j], dp[i][j-1]);}}}return word1.length() word2.length() - 2 * dp[word1.length()][word2.length()] ;}
} 72. 编辑距离 给你两个单词 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) 思路 定义:dp[i][j] 表示以下标i-1为结尾的字符串word1和以下标j-1为结尾的字符串word2最近编辑距离为dp[i][j]。 递推: 在确定递推公式的时候首先要考虑清楚编辑的几种操作整理如下 if (word1[i - 1] word2[j - 1])不操作
if (word1[i - 1] ! word2[j - 1])增删换 if (word1[i - 1] word2[j - 1]) 那么说明不用任何编辑dp[i][j] 就应该是 dp[i - 1][j - 1]即dp[i][j] dp[i - 1][j - 1]; if (word1[i - 1] ! word2[j - 1])此时就需要编辑了如何编辑呢 操作一word1删除一个元素那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。 即 dp[i][j] dp[i - 1][j] 1; 操作二word2删除一个元素那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作。 即 dp[i][j] dp[i][j - 1] 1; 这里有同学发现了怎么都是删除元素添加元素去哪了。 word2添加一个元素相当于word1删除一个元素例如 word1 ad word2 aword1删除元素d 和 word2添加一个元素d变成word1a, word2ad 最终的操作数是一样 dp数组如下图所示意的 a a d---------- ---------------| 0 | 1 | | 0 | 1 | 2 |---------- ---------------a | 1 | 0 | a | 1 | 0 | 1 |---------- ---------------d | 2 | 1 |----------操作三替换元素word1替换word1[i - 1]使其与word2[j - 1]相同此时不用增删加元素。 可以回顾一下if (word1[i - 1] word2[j - 1])的时候我们的操作 是 dp[i][j] dp[i - 1][j - 1] 对吧。 那么只需要一次替换的操作就可以让 word1[i - 1] 和 word2[j - 1] 相同。 所以 dp[i][j] dp[i - 1][j - 1] 1; 综上当 if (word1[i - 1] ! word2[j - 1]) 时取最小的即dp[i][j] min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) 1; 初始化:按照dp定义 首列初始化为列下标 首行初始化为行下标 代码 class Solution {public int minDistance(String word1, String word2) {int len1 word1.length(), len2 word2.length();//word1 0到i-1转为 word2 0到j-1的最少操作数int [][] dp new int [len1 1][len2 1];for(int i 0; i len1 ; i){dp[i][0] i;}for(int j 0; j len2; j){dp[0][j] j;}for(int i 1; ilen1; i){for(int j 1; j len2; j){if(word1.charAt(i-1) word2.charAt(j-1)){dp[i][j] dp[i-1][j-1];}else{int del1 dp[i-1][j] 1; // 删除word1中字符i-1int del2 dp[i][j-1] 1; // 删除word2中字符j-1//删除某个word中的字符 与 在另一个word中添加 是等价的 故只需要计算删除即可int rep dp[i-1][j-1] 1; //替换字符int min Math.min(del1, del2);min Math.min(min, rep);dp[i][j] min;}}}return dp[len1][len2];}
} 编辑距离总结篇 代码随想录 (programmercarl.com)