给定两个单词 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.举例推导
做题之前,可以自己先思考这三个问题:
后序的跟着博主解题,大家就会慢慢感受到这五步的重要性了。
博主会持续更新LeetCode的题解和Java学习过程的问题噢(都按照题型进行分类啦~),如果对你有帮助的话,请帮博主点个赞,关注博主一起成长吧!