> 文档中心 > LeetCode72. 编辑距离

LeetCode72. 编辑距离


思路

1.定义dp数组

因为又是字符串相关问题,所以定义为i-1

dp[i][j]:表示word1中下标以i-1结尾的字符串和word2中以下标j-1结尾的字符串相等需要的最少的操作数为dp[i][j]。

2.递推公式

如果word1中下标以i-1结尾的字符和word2中下标以j-1结尾的字符相等的话,dp[i][j] = dp[i-1][j-1].说明当前的字符不需要处理。

如果不相等的话就需要处理了。分为三种情况,只处理word1,只处理word2,word1和word2一起处理。

所以dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1);

dp[i-1][j]+1就是将word1中不相等的i-1位置的字符删除掉。

dp[i][j-1]+1。就是添加一个元素在word1中。word2中删除一个元素,word1中相等于多了一个元素。

dp[i-1][j-1]+1就是直接将两者不相等的其中一个换为另一个。

3.初始化

根据定义很容易初始化的。dp[i][0] = i;dp[0][j] = j.

4.遍历dp数组

根据dp数组的定义可以知道是正序遍历。

5.打印dp数组

dp数组的最后一个元素就是最后的结果。

代码

class Solution {    public int minDistance(String word1, String word2) { int l1 = word1.length(); int l2 = word2.length(); int dp [][] = new int[l1+1][l2+1];  for(int i = 0;i<=l1;i++){     dp[i][0] = i; } for(int j = 0;j<=l2;j++){     dp[0][j] = j; } for(int i = 1;i<=l1;i++){     for(int j = 1;j<=l2;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[l1][l2];    }}