本文主要是介绍【LeetCode】583. 两个字符串的删除操作(中等)——代码随想录算法训练营Day55,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:583. 两个字符串的删除操作
题目描述
给定两个单词 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
只包含小写英文字母
文章讲解:代码随想录
视频讲解:动态规划之子序列,还是为了编辑距离做铺垫 | LeetCode:583.两个字符串的删除操作_哔哩哔哩_bilibili
题解1:动态规划
思路:使用动态规划法求解子序列问题。
动态规划分析:
- dp 数组以及下标的含义:dp[i][j] 代表使得以 word1[i - 1] 和 word2[j - 1] 结尾的两个字符串相同的最小步数。
- 递推公式:word1[i - 1] 等于 word2[j - 1] 时,dp[i][j] = dp[i - 1][j - 1];否则,dp[i][j] = Math.min(dp[i - 1][j] , dp[i][j - 1]) + 1。
- dp 数组初始化:dp[i][0] = i,dp[0][j] = j。
- 遍历顺序:从上往下,从左往右。
- 打印 dp 数组:以输入 word1 = "sea"、word2 = "eat" 为例,dp 数组为 [ [ 0, 1, 2, 3 ], [ 1, 2, 3, 4 ], [ 2, 1, 2, 3 ], [ 3, 2, 1, 2 ] ]。
/*** @param {string} word1* @param {string} word2* @return {number}*/
var minDistance = function(word1, word2) {const dp = new Array(word1.length + 1).fill().map(() => new Array(word2.length + 1).fill(0));for (let i = 1; i <= word1.length; i++) {dp[i][0] = i;}for (let j = 1; j <= word2.length; j++) {dp[0][j] = j;}for (let i = 1; i <= word1.length; i++) {for (let j = 1; j <= word2.length; j++) {if (word1[i - 1] === word2[j - 1]) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = Math.min(dp[i - 1][j] , dp[i][j - 1]) + 1;}}}return dp[word1.length][word2.length];
};
分析:时间复杂度为 O(m * n),空间复杂度为 O(m * n)。
题解2:最长公共子序列
思路:可以先求出 word1 和 word2 的最长公共子序列,然后在删除最长公共子序列外的其他字母,即可得到相同的两个字符串。
/*** @param {string} word1* @param {string} word2* @return {number}*/
var minDistance = function(word1, word2) {const dp = new Array(word1.length + 1).fill().map(() => new Array(word2.length + 1).fill(0));for (let i = 1; i <= word1.length; i++) {for (let j = 1; j <= word2.length; j++) {if (word1[i - 1] === word2[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 - dp[word1.length][word2.length] * 2;
};
分析:时间复杂度为 O(n * m),空间复杂度为 O(n * m)。
收获
练习使用动态规划法求解子序列问题,为编辑距离问题打基础。
这篇关于【LeetCode】583. 两个字符串的删除操作(中等)——代码随想录算法训练营Day55的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!