两个字符串的删除操作(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];
    }
};
目录
相关文章
|
3月前
leetcode-583:两个字符串的删除操作
leetcode-583:两个字符串的删除操作
27 0
|
3月前
|
Java C++ Python
leetcode-1047:删除字符串中的所有相邻重复项
leetcode-1047:删除字符串中的所有相邻重复项
21 0
|
3月前
|
算法
leetcode-26:删除排序数组中的重复项
leetcode-26:删除排序数组中的重复项
24 1
|
7月前
|
存储
顺序表oj--移除元素&&删除重复项&&合并两个有序数组
顺序表oj--移除元素&&删除重复项&&合并两个有序数组
|
4月前
|
算法 C语言
【408数据结构与算法】—顺序表的插入、删除和查找(四)
【408数据结构与算法】—顺序表的插入、删除和查找(四)
|
6月前
【Leetcode-20.有效的括号 -26.删除有序数组中的重复项】
【Leetcode-20.有效的括号 -26.删除有序数组中的重复项】
15 0
|
7月前
⌈力扣⌋删除字符串中的所有相邻重复项
⌈力扣⌋删除字符串中的所有相邻重复项
35 0
|
8月前
|
算法
【leetcode系列】26. 删除排序数组中的重复项
【leetcode系列】26. 删除排序数组中的重复项
46 0
|
10月前
leetcode:26.删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
41 0
|
12月前
|
算法
LeetCode:1047. 删除字符串中的所有相邻重复项——栈
题目描述:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一