两个字符串的删除操作(LeetCode-583)

简介: 两个字符串的删除操作(LeetCode-583)

两个字符串的删除操作(LeetCode-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 只包含小写英文字母


思路

五部曲


dp[i][j] 含义


以 i − 1 i-1i−1 为结尾的字符串word1和以 j − 1为结尾的字符串word2t想要相等,需要删除元素的最小次数

递推公式


如果 w o r d 1 [ i − 1 ] = w o r d 2 [ j − 1 ]

次数为 d p [ i − 1 ] [ j − 1 ]

如果二者不相等,有下述三种情况

删除 w o r d 1 [ i − 1 ] ,最少操作次数为 d p [ i − 1 ] [ j ] + 1

删除 w o r d 2 [ j − 1 ] ,最少操作次数为 d p [ i ] [ j − 1 ] + 1

二者取最小值

数组初始化


dp[i][0] word2为空字符串,明显等于 i

dp[0][j] word1为空字符串,明显等于 j

遍历顺序


从前往后

测试用例



代码展示

class Solution
{
public:
    int minDistance(string word1, string word2)
    {
        int n1 = word1.size();
        int n2 = word2.size();
        vector<vector<int>> dp(n1 + 1, vector<int>(n2 + 1));
        for (int i = 1; i <= n1; i++)
        {
            dp[i][0] = i;
        }
        for (int j = 1; j <= n2; j++)
        {
            dp[0][j] = j;
        }
        for (int i = 1; i <= n1; i++)
        {
            for (int j = 1; j <= n2; 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, dp[i][j - 1] + 1);
                }
            }
        }
        return dp[n1][n2];
    }
};
目录
相关文章
|
6月前
leetcode-583:两个字符串的删除操作
leetcode-583:两个字符串的删除操作
46 0
|
1月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
34 2
|
3月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
3月前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
5月前
|
存储 SQL 算法
LeetCode 题目 82:删除排序链表中的重复元素 II
LeetCode 题目 82:删除排序链表中的重复元素 II
|
6月前
|
算法
LeetCode | 26. 删除有序数组中的重复项
LeetCode | 26. 删除有序数组中的重复项
|
6月前
|
C++
LeetCode 26. 删除有序数组中的重复项
LeetCode 26. 删除有序数组中的重复项
35 0
26.删除有序数组中的重复项(LeetCode)
26.删除有序数组中的重复项(LeetCode)
|
算法 安全 Swift
LeetCode - #26 删除有序数组中的重复项
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
每日一题——删除链表中重复的元素——II
每日一题——删除链表中重复的元素——II