解法一:递归

解法二:(动态规划)①定义:dp[i][j]为word1中前i个字符转化为word2中前j个字符所需操作数;dp[m+1][n+1] ②初始状态:dp[0][j]=j(0变为j,需要j步),dp[i][0]=i(i变为0,需要i步) ③状态转移方程:若word1.charAt(i)==word2.charAt(j),则不需要变化dp[i][j]=dp[i-1][j-1];否则,dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1,其中dp[i-1][j]执行word1插入word2.charAt(j),dp[i][j-1]执行word1删除word2.charAt(j),dp[i-1][j-1]执行word1.charAt(i)替换为word2.charAt(j)
class Solution {public int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();int[][] dp = new int[m+1][n+1];for(int i=0;i<=m;i++){dp[i][0]=i;}for(int j=0;j<=n;j++){dp[0][j]=j;}for(int i=1;i<=m;i++){for(int j=1;j<=n;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],dp[i][j-1]),dp[i-1][j-1])+1;}}}return dp[m][n];}
}
注意:
- 模式识别:一旦涉及子问题,可以用自顶向下(从最难的状态开始计算)的递归和自底向上(从最简单的状态开始计算)的动态规划
- 涉及到返回过程时用递归;返回数字时用动态规划
- 涉及‘和’或‘前几个字符’定义多一个数,即dp[m+1][n+1]
- 取字符时要-1,因为
dp[m+1][n+1]
要比字符串下标大1,word2.charAt(j-1);