LeetCode动态规划编辑距离问题——583. 两个字符串的删除操作

题目描述:

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

给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数

每步 可以删除任意一个字符串中的一个字符。

分析:

牢记动态规划五步:

1.确定dp数组含义

2.确定递推公式

3.dp数组初始化

4.确定遍历顺序

01背包问题:一维dp的遍历,商品放在外循环,背包在内循环,且内循环倒序。

求组合:先遍历商品,再遍历背包

求排列:先便利背包,再遍历商品

求最大最小:对遍历顺序没有要求

5.举列推导

代码:

class Solution {
    public int minDistance(String word1, String word2) {
        int len1=word1.length();
        int len2=word2.length();
        //dp[i][j]:使得s[i-1]和s[j-1]相同的最小步数
        int[][] dp=new int[len1+1][len2+1];
        for(int i=0;i<=len1;i++) dp[i][0]=i;
        for(int j=0;j<=len2;j++) dp[0][j]=j;

        for(int i=1;i<=len1;i++){
            char c1=word1.charAt(i-1);
            for(int j=1;j<=len2;j++){
                char c2=word2.charAt(j-1);
                if(c1==c2){
                    dp[i][j]=dp[i-1][j-1];
                }else{
                    /*如果最后一个字符不同,可以有三种操作:
                    1.把两个字符都删掉。操作次数+2
                    2.把word1的字符删掉或把word2的字符删掉,操作次数+1
                    */
                    dp[i][j]=Math.min(dp[i-1][j-1]+2,Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
                }
            }
        }
        return dp[len1][len2];
    }
}

动态规划做题方法:

做动规题目的时候,很多同学会陷入一个误区,就是以为把状态转移公式背下来,照葫芦画瓢改改,就开始写代码,甚至把题目AC之后,都不太清楚dp[i]表示的是什么。这就是一种朦胧的状态,然后就把题给过了,遇到稍稍难一点的,可能直接就不会了,然后看题解,然后继续照葫芦画瓢陷入这种恶性循环中。 确定递推公式仅仅是动态规划解题的一步!知道递推公式,但不知道dp数组要怎么初始化,数组要怎么正确的遍历

所以,我们始终牢记动态规划五步:

1.确定dp数组含义

2.确定递推公式

3.dp数组初始化

4.确定遍历顺序

5.举例推导

做题之前,可以自己先思考这三个问题:

  • 这道题目我举例推导状态转移公式了么?
  • 我举例推导dp数组了嘛?
  • 打印出来的dp数组和我想的一样么?

后序的跟着博主解题,大家就会慢慢感受到这五步的重要性了。

博主会持续更新LeetCode的题解和Java学习过程的问题噢(都按照题型进行分类啦~),如果对你有帮助的话,请帮博主点个赞,关注博主一起成长吧!

猜你喜欢

转载自blog.csdn.net/w20001118/article/details/126913649