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


    题目描述:

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

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

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

     

    分析:

    牢记动态规划五步:

    1.确定dp数组含义

    2.确定递推公式

    3.dp数组初始化

    4.确定遍历顺序

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

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

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

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

    5.举列推导

    代码:

    1. class Solution {
    2. public int minDistance(String word1, String word2) {
    3. int len1=word1.length();
    4. int len2=word2.length();
    5. //dp[i][j]:使得s[i-1]和s[j-1]相同的最小步数
    6. int[][] dp=new int[len1+1][len2+1];
    7. for(int i=0;i<=len1;i++) dp[i][0]=i;
    8. for(int j=0;j<=len2;j++) dp[0][j]=j;
    9. for(int i=1;i<=len1;i++){
    10. char c1=word1.charAt(i-1);
    11. for(int j=1;j<=len2;j++){
    12. char c2=word2.charAt(j-1);
    13. if(c1==c2){
    14. dp[i][j]=dp[i-1][j-1];
    15. }else{
    16. /*如果最后一个字符不同,可以有三种操作:
    17. 1.把两个字符都删掉。操作次数+2
    18. 2.把word1的字符删掉或把word2的字符删掉,操作次数+1
    19. */
    20. dp[i][j]=Math.min(dp[i-1][j-1]+2,Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
    21. }
    22. }
    23. }
    24. return dp[len1][len2];
    25. }
    26. }

    动态规划做题方法:

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

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

    1.确定dp数组含义

    2.确定递推公式

    3.dp数组初始化

    4.确定遍历顺序

    5.举例推导

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

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

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

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

  • 相关阅读:
    请问有哪些让人惊艳的数据可视化工具?
    【数据分析】2020年北京交通大学计算机学院学术型博士录取数据分析
    Flutter GetX使用详解
    ES6 部分新特性使用
    鲜花商城管理系统
    Linux常用命令记录
    彩色年终工作总结汇报PPT模板下载
    Spring Boot之AJAX异步发送帖子
    AFG EDI 解决方案
    docker 命令
  • 原文地址:https://blog.csdn.net/w20001118/article/details/126913649