思路:动态规划 ①dp[i][j] 表示以下标 i-1 为结尾的字符串word1,和以下标 j-1 为结尾的字符串word2,最近编辑距离为dp[i][j]。
②初始化
int[][]dp=new int[l1+1][l2+1]
dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2,最近编辑距离为dp[i][0]。即对word1里的元素全部做删除操作,即:dp[i][0] = i;
同理dp[0][j] = j;
③递推
if (word1[i - 1] == word2[j - 1])
不操作
【即dp[i][j] = dp[i - 1][j - 1]】
if (word1[i - 1] != word2[j - 1])
增
删
换
【删】:word1删除一个元素,那么就是以下标i - 2为结尾的word1,与 j-1为结尾的word2,的最近编辑距离,再加上一个操作。 即 dp[i][j] = dp[i - 1][j] + 1; 【增】:word1增加一个元素,相当于word2删除一个元素,那么就是以下标i - 1为结尾的word1,与 j-2为结尾的word2,的最近编辑距离,再加上一个操作。 即 dp[i][j] = dp[i][j - 1] + 1; 【换】:word1替换word1[i - 1],使其与word2[j - 1]相同,那么以下标i-2为结尾的word1, 与 j-2为结尾的word2,的最近编辑距离,加上一个操作。
即 dp[i][j] = dp[i - 1][j - 1] + 1;
class Solution {
public int minDistance(String word1, String word2) {
int l1=word1.length(),l2=word2.length();
int[][]dp=new int[l1+1][l2+1];
for(int i=0;i<=l1;i++){
for(int j=0;j<=l2;j++){
if(i==0) {dp[0][j]=j;continue;}
if(j==0) {dp[i][0]=i;continue;}
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[l1][l2];
}
}
|