两个字符串的删除操作(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:两个字符串的删除操作
28 0
|
3月前
|
Java C++ Python
leetcode-1047:删除字符串中的所有相邻重复项
leetcode-1047:删除字符串中的所有相邻重复项
22 0
|
3月前
|
算法
leetcode-26:删除排序数组中的重复项
leetcode-26:删除排序数组中的重复项
24 1
|
7月前
|
存储
顺序表oj--移除元素&&删除重复项&&合并两个有序数组
顺序表oj--移除元素&&删除重复项&&合并两个有序数组
|
6月前
【Leetcode-20.有效的括号 -26.删除有序数组中的重复项】
【Leetcode-20.有效的括号 -26.删除有序数组中的重复项】
15 0
|
7月前
⌈力扣⌋删除字符串中的所有相邻重复项
⌈力扣⌋删除字符串中的所有相邻重复项
35 0
|
8月前
|
算法
【leetcode系列】26. 删除排序数组中的重复项
【leetcode系列】26. 删除排序数组中的重复项
46 0
|
10月前
每日一题——删除链表中重复的元素——II
每日一题——删除链表中重复的元素——II
|
10月前
每日一题——删除有序链表中重复的元素——I
每日一题——删除有序链表中重复的元素——I
|
10月前
每日一题——删除字符串中的所有相邻重复项
每日一题——删除字符串中的所有相邻重复项