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

这篇具有很好参考价值的文章主要介绍了代码随想录打卡第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

如果不相等:则有三种情况

情况1:i不退,j往前退一步 (操作加1)//删除单词2的字母

情况2:i往前退一步,j不退(操作加1)// 删除单词1的字母

情况3:i,j都往前退一步(操作加2)// 两个单词的字母都删除

关键点3:dp数组初始化

需要对最左边那列和最上面那行进行初始化

dp[i][0] = dp[i-1][-1]:表示单词1不是空,单词2是空的情况下,单词1要与单词2相同所需的最小删除步数,所以初始化为i

dp[0][j] = dp[-1][j-1]:表示单词1是空,单词2不是空的情况下,单词2要与单词1相同所需的最小删除步数,所以初始化为j

而其它元素可初始化为0;

关键点4:遍历顺序

由于下一个dp值与上一个dp值有关,因此for循环从前往后遍历(0已经初始化,且为使递归公式的dp[i-1][j-1]有意义,i,j都从1开始遍历)。

class Solution {
    public int minDistance(String word1, String word2) {
        // dp[i][j],使得以i-1为结尾word1 和 以j-1为结尾的word2 相同所需的最小步数。
        int[][] dp = new int[word1.length()+1][word2.length()+1];
        // 初始化
        for(int i = 0;i <= word1.length();i++){
            dp[i][0] = i;
        }
        for(int j = 0;j <= word2.length();j++){
            dp[0][j] = j;
        }

        for(int i = 1;i <= word1.length();i++){
            for(int j = 1;j <= word2.length();j++){
                if(word1.charAt(i-1) == word2.charAt(j-1) ){
                    dp[i][j] = dp[i-1][j-1];
                }else{
                // 删除单词1的字母/删除单词2的字母/两个单词的字母都删除
                    dp[i][j] = Math.min(Math.min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+2); 
                }
            }
        }
        return dp[word1.length()][word2.length()];

    }
}

72. 编辑距离 

关键点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

如果不相等:则有三种情况

情况1(增):i往前退一步,j不退 (操作加1)//增加单词1的字母

情况2(删):i不退,j往前退一步(操作加1)// 删除单词2的字母

情况3(改):i,j都往前退一步(操作加1)// 将其中一个单词的字母换成和另外一个单词的字母一样

关键点3:dp数组初始化

需要对最左边那列和最上面那行进行初始化

dp[i][0] = dp[i-1][-1]:表示单词1不是空,单词2是空的情况下,单词1要与单词2相同所需的最小删除步数,所以初始化为i

dp[0][j] = dp[-1][j-1]:表示单词1是空,单词2不是空的情况下,单词2要与单词1相同所需的最小删除步数,所以初始化为j

而其它元素可初始化为0;

关键点4:遍历顺序

由于下一个dp值与上一个dp值有关,因此for循环从前往后遍历(0已经初始化,且为使递归公式的dp[i-1][j-1]有意义,i,j都从1开始遍历)。

class Solution {
    public int minDistance(String word1, String word2) {
        // dp[i][j],使得以i-1为结尾word1 和 以j-1为结尾的word2 相同所需的最小步数。
        int[][] dp = new int[word1.length()+1][word2.length()+1];

        // 初始化
        for(int i = 0;i <= word1.length();i++){
            dp[i][0] = i;
        }
        for(int j = 0;j <= word2.length();j++){
            dp[0][j] = j;
        }

        for(int i = 1;i <= word1.length();i++){
            for(int j = 1;j <= word2.length();j++){
                if(word1.charAt(i-1) == word2.charAt(j-1) ){
                    dp[i][j] = dp[i-1][j-1];
                }else{
                // 插入一个字符/删除一个字符/替换一个字符
                    dp[i][j] = Math.min(Math.min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1); 
                }
            }
        }
        return dp[word1.length()][word2.length()];

    }
}

 文章来源地址https://www.toymoban.com/news/detail-418287.html

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

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

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

相关文章

  • 代码随想录打卡第35天

    2024年02月12日
    浏览(20)
  • 代码随想录Day_52打卡

    给你一个整数数组  nums  ,找到其中最长严格递增子序列的长度。 子序列  是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如, [3,6,2,7]  是数组  [0,3,1,6,2,2,7]  的子序列。 事例: 思路:        使用动态规划,dp含义:dp[i]表示数

    2024年02月10日
    浏览(25)
  • 代码随想录Day_48打卡

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。 给定一个代表每个房屋存放金额的非负整数数组,计算你  不触

    2024年02月11日
    浏览(22)
  • 代码随想录打卡—day41—【DP】— 8.26+27 DP基础3

    343. 整数拆分 一开始做 没有思路,学习了题解才,ac代码: 后来仔细看题解,其实 for - j 的次数可以优化—— 注意 枚举j的时候,是从1开始的。从0开始的话,那么让拆分一个数拆个0,求最大乘积就没有意义了。 优化1: j 的结束条件是 j i - 1 ,其实 j i 也是可以的,不过

    2024年02月11日
    浏览(22)
  • 代码随想录笔记--字符串篇

    目录 1--反转字符串 2--反转字符串II 3--反转字符串中的单词 4--KMP算法 5--重复的子字符串 主要思路:         双指针算法,交换两个指针的字符; 主要思路:         以 2k 个字符为一组进行遍历; 主要思路1:         遍历提取每一个有效的单词,存储在一个栈中,最后遍

    2024年02月10日
    浏览(29)
  • 代码随想录 字符串 Java

    复杂度分析: 时间复杂度:O(N),其中N为字符数组的长度。一共执行了N/2次的交换 空间复杂度:O(1),只使用了常数空间来存放若干变量 我的思路:2k个字符为一组,先将前k个字符(或者不足k个字符)添加到StringBuilder中,然后调用reverse()方法,然后再将后k个字符(或者不足

    2024年02月06日
    浏览(26)
  • 代码随想录--字符串-反转字符串

    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 示例 1: 输入:

    2024年02月09日
    浏览(35)
  • 代码随想录字符串专题复盘day15

    KMP算法 KMP算法的经典思想就是:当出现字符串不匹配的时候,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配 前缀表 next数组就是一个前缀表 前缀表是用来回退的,它记录了模式串与主串不匹配的时候,模式串应该从哪里开始重新匹配 前缀表的

    2024年01月20日
    浏览(31)
  • 代码随想录 Leetcode459. 重复的子字符串(KMP算法)

            此解法读者需要了解什么是KMP算法以及KMP算法中next数组的具体含义才能理解         因为在KMP算法的next数组中,next[index]表示 i ndex之前的最大长度的相同前缀后缀值 ,那么要判断整个字符串中是否由重复字串构成,只需要以下两个条件:         1.next[n - 1] !=

    2024年01月19日
    浏览(49)
  • 代码随想录day9|实现strStr()、重复的子字符串

    一般的字符串匹配问题我们可以使用KMP算法来处理,当我们搜索文本串和模式串是否匹配的时候,我们先得到模式串的一个前缀表,其中前缀表中存放的内容是模式串的最长相等前后缀。例如文本串为:aabaabaafa,模式串为:aabaaf,那么文本串的前缀表就是010120。当我们开始搜

    2024年02月15日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包