【LeetCode】583. 两个字符串的删除操作

这篇具有很好参考价值的文章主要介绍了【LeetCode】583. 两个字符串的删除操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

583. 两个字符串的删除操作(中等)

【LeetCode】583. 两个字符串的删除操作
【LeetCode】583. 两个字符串的删除操作
【LeetCode】583. 两个字符串的删除操作

思路

这道题的状态定义和 1143. 最长公共子序列 相同,「定义一个 dp 数组,其中 dp[i]表示到位置 i 为止的子序列性质,并不是必须以 i 结尾」,此时 dp 数组的最后一位即为题目所求,不需要对每个位置进行统计。

状态定义

dp[i][j] 表示到 字符串word1 的第 i 个字符为止、word2 的第 j 个字符为止,使得两个字符串相等的最小删除次数。

状态转移方程

对于本道题,遍历两个字符串的所有位置,当 i>0 且 j>0 时,考虑两种情况:

  • 如果遍历到的字符相同,说明这两个字符匹配,无需进行任何操作,那么此时的最小删除次数不变,即 dp[i][j] = dp[i-1][j-1]
  • 如果遍历到的字符不同,那么肯定需要删除其中一个字符,既可以删除 word1[i],也可以删除 word2[j],所以此时的最小删除次数在原有删除次数上 +1, 即 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1

初始化

由于在进行状态转移时,我们会用到 i-1 和 j-1 ,需要保证数组不越界,因此对边界情况进行分析:

  • 当 i = 0 且 j = 0 时,如果 word2[0] == word1[i] ,说明不需要删除,所以 dp[0][0] = 0,否则两个字符都需要删除,dp[0][0] = 2
  • 当 i = 1 ~ m-1 时,固定 j = 0,即 word2 只有一个字符,如果 word1[i] == word2[0] ,说明两个字符串能够匹配,此时需要删除 word1 的其他字符,即 dp[i][0] = i
  • 同理,当 j = 1 ~ n-1 时,固定 i = 0,即 word1 只有一个字符,如果 word1[0] == word2[j] ,说明两个字符串能够匹配,此时需要删除 word2 的其他字符,即 dp[0][j] = j

最终的返回结果

显然,最终返回 dp[m-1][n-1] ,这表示到字符串word1 的第 m-1 个字符为止、word2 的第 n-1 个字符为止,使得两个字符串相等的最小删除次数。文章来源地址https://www.toymoban.com/news/detail-458092.html

代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.size(), n = word2.size();
        vector<vector<int>> dp(m, vector<int>(n));
        dp[0][0] = word1[0] == word2[0] ? 0 : 2;
        for(int i=1; i<m; ++i){
            if(word2[0] == word1[i]){
                dp[i][0] = i; 
            }else{
                dp[i][0] = dp[i-1][0] + 1; 
            }
        }
        for(int j=1; j<n; ++j){
            if(word1[0] == word2[j]){
                dp[0][j] = j; 
            }else{
                dp[0][j] = dp[0][j-1] + 1; 
            }
        }        
        for(int i=1; i<m; ++i){
            for(int j=1; j<n; ++j){
                if(word1[i] == word2[j]){
                    dp[i][j] = dp[i-1][j-1];
                }else{
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1;
                }
            }
        } 
        return dp[m-1][n-1];
    }
};

到了这里,关于【LeetCode】583. 两个字符串的删除操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录打卡第56天|583. 两个字符串的删除操作;72. 编辑距离

    583. 两个字符串的删除操作 关键点1:dp数组的含义 dp[i][j],使得以i-1为结尾word1 和 以j-1为结尾的word2 相同所需的最小步数; 关键点2:递归公式的推导 if(nums1[i-1] == nums2[j-1]),则i和j同时移动,所以为i-1,j-1;dp[i][j] = dp[i-1][j-1];由于不需要进行删除操作,所以不需要加1 如果不相

    2023年04月19日
    浏览(47)
  • 每日一题之两个字符串的删除操作

    题目链接 给定两个单词  word1  和  word2  ,返回使得  word1  和   word2  ** 相同 所需的 最小步数 。 每步  可以删除任意一个字符串中的一个字符。 示例 1: 示例  2: 提示: 1 = word1.length, word2.length = 500 word1  和  word2  只包含小写英文字母 我们可以定义一个二维数组 dp ,

    2024年02月15日
    浏览(33)
  • 【dp】不同的子序列 & 两个字符串的删除操作 & 编辑距离

    dp[i][j]:以j-1为结尾的t出现在以i-1为结尾的s子序列的个数 需要开辟m+1行,n+1列的二维数组 为啥状态方程是: s[i] == t[j] 时 dp[i][j] = dp[i-1][j-1] + dp[i-1][j] s[i] != t[j] 时 dp[i][j] = dp[i-1][j] 先看s[i] == t[j] 时,以s = “rara” t = “ra” 为例,当i = 3, j = 1时,s[i] == t[j] 此时分为2种情况:

    2023年04月15日
    浏览(37)
  • 代码随想录第五十六天——两个字符串的删除操作,编辑距离

    题目链接:两个字符串的删除操作 两个字符串可以相互删除 版本一: 确定dp数组及下标的含义 dp[i][j] :以i-1为结尾的字符串word1,和以j-1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数 确定递推公式 (1)当word1[i - 1] 与 word2[j - 1]相同: (2)当word1[i - 1] 与

    2024年02月02日
    浏览(34)
  • 【LeetCode2696】删除子串后的字符串最小长度

    【题目链接】 标签: 栈 、 字符串 、 模拟 难度: 简单 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 “AB” 或 “CD” 子字符串。 通过执行操作,删除所有 “AB” 和 “CD” 子串,返回可获得的

    2024年01月17日
    浏览(36)
  • LeetCode 2696. 删除子串后的字符串最小长度

    1、题目描述 给你一个仅由  大写  英文字符组成的字符串  s  。 你可以对此字符串执行一些操作,在每一步操作中,你可以从  s  中删除  任一个   \\\"AB\\\"  或  \\\"CD\\\"  子字符串。 通过执行操作,删除所有  \\\"AB\\\"  和  \\\"CD\\\"  子串,返回可获得的最终字符串的  最小  可能长度

    2024年01月19日
    浏览(53)
  • Redis 分批删除字符串键操作

    有时候我们需要清理一些非常大的key(如hash键),或者通配非常多的(如string类型), 如果直接使用keys、del操作会对线上的redis有性能影响,一般建议使用unlink 异步删除操作,释放交给redis自身去处理,但也有一些场景,可能需要快速释放内存,或者通配去删除 ,或者针对

    2024年02月15日
    浏览(38)
  • 代码随想录 Leetcode1047. 删除字符串中的所有相邻重复项

            时间复杂度高         写完代码多思考怎么优化

    2024年01月22日
    浏览(48)
  • (栈和队列) 1047. 删除字符串中的所有相邻重复项 ——【Leetcode每日一题】

    难度:简单 给出由小写字母组成的字符串 S , 重复项删除操作 会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入 :“abbaca” 输出 :“ca” 解释

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包