Day56 | 583. 两个字符串的删除操作 | 72. 编辑距离

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

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

注意点:

1.当word1[i - 1] 与 word2[j - 1]不相同的时候,

情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1

情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1

情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2

因为dp[i][j-1]+1 = dp[i-1][j-1]+2,最后当然是取最小值min(dp[i-1][j]+1, dp[i][j-1]+1)

class Solution {
public:
    int minDistance(string word1, string word2) {
        // dp:i-1的word1和j-1的word2相同所需的最小步数
        vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1));
        // 初始化  当dp[0][0]的时候直接就是0,因为不需要变化他俩就是相等的
        for(int i =0; i<= word1.size(); i++) dp[i][0] = i;
        for(int j = 0; j <= word2.size(); j++) dp[0][j] = j;

        for(int i = 1; i <= word1.size(); i++) {
            for(int j = 1; j<= word2.size(); 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, dp[i-1][j-1]+2);
    // 当word1[i-1] != word2[j-1]时,对i-1或者j-1取最小值即可,dp[i][j-1]+1 = dp[i-1][j-1]+2
                else dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1);
            }
        }
        return dp[word1.size()][word2.size()];


    }
};
72. 编辑距离

注意点:

  1. min三个数的时候要加{},如min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]})+1;

  1. 删除操作,word1删除dp[i-1][j],word2删除dp[i][j-1],所以是dp[i-1][j], dp[i][j-1]

3. 添加操作,word1删除和word2添加操作数是一样的,word1 = ab, word2 = a, 删除word1中的b;word2添加后是ab 所以是dp[i-1][j], dp[i][j-1]

4. 替换后才能到达if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1],所以在dp[i-1][j-1]的基础上加1文章来源地址https://www.toymoban.com/news/detail-472394.html

class Solution {
public:
    int minDistance(string word1, string word2) {
        // dp[i][j]:以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最少操作数为dp[i][j]
        vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1));

        for(int i = 0; i <= word1.size(); i++) dp[i][0] = i;
        for(int j = 0; j <= word2.size(); j++) dp[0][j] = j;

        for(int i = 1; i <= word1.size(); i++) {
            for(int j =1; j <= word2.size(); j++) {
                if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];
                // 这是删除操作,word1删除dp[i-1][j],word2删除dp[i][j-1]
                // 添加操作,word1删除和word2添加操作数是一样的,word1 = ab, word2 = a, 删除word1中的b;word2添加后是ab 
                // 替换后才能到达if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1],所以在dp[i-1][j-1]的基础上加1
                else dp[i][j] = min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]})+1;
            }
        }
        
        return dp[word1.size()][word2.size()];
    }
};

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

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

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

相关文章

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

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

    2024年02月06日
    浏览(48)
  • 每日一题之两个字符串的删除操作

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

    2024年02月15日
    浏览(39)
  • 【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日
    浏览(45)
  • 代码随想录第五十六天——两个字符串的删除操作,编辑距离

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

    2024年02月02日
    浏览(40)
  • 【Day28】力扣算法(超详细思路+注释) [1790. 仅执行一次字符串交换能否使两个字符串相等 ] [328. 奇偶链表 ][148. 排序链表]

    原题链接:1790. 仅执行一次字符串交换能否使两个字符串相等 题目描述 : 给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。 如果对 其中一个字符串 执行 最多一次字符串交

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

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

    2024年02月15日
    浏览(43)
  • 算法训练day11Leetcode20有效的括号1047删除字符串中所有相邻重复项150逆波兰表达式求值

    https://leetcode.cn/problems/valid-parentheses/description/ https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html 判断右括号后忘记pop 括号匹配是使用栈解决的经典问题。 如果还记得编译原理的话,编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,也是使用了栈

    2024年01月17日
    浏览(76)
  • day11 代码回想录-栈与队列part02-有效的括号&删除字符串中的所有相邻重复项&逆波兰表达式求值

    大纲 ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值 有效的括号 题目链接:20. 有效的括号 题目需要判断括号是否匹配 解题思路: 使用栈来实现,当为**{[( 时入栈,当遇到 )]} 时,判断栈顶元素释放能匹配。需要单独处理只有 右边**单个

    2024年02月11日
    浏览(59)
  • 从零开始学Java56--与字符串相关的正则表达式

    在上一篇文章中给大家介绍了 String字符串及其各种常用API方法 ,接下来继续给大家讲解一些 String字符串的高级玩法。 有时候我们操作一个字符串时,这个字符串的内容并不一定就是固定不变的。比如在用户注册时,我们要求用户在输入框中输入自己的手机号码。我们知道,

    2024年02月06日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包