题目链接:https://leetcode.com/problems/edit-distance/
看到这道题的第一反应就是用DP,思路如下:
首先定义dp[i][j],word1从第一个字符到第i个字符
word2从第一个字符到第j个字符,那么dp[i][j]表示两个
字符(第几个)分别从1~i ,1~j 分别需要几步变换。
那么会遇到下面几种情形(word1[i-1]和word[j-1]才是当前要比较的字符):
1). word1[i-1]==word2[j-1]:
此时dp[i][j]=dp[i-1][j-1];
2 ) . word1[i-1]!=word2[j-1]:
这种情形可以分为三种情况,对应例子中提到的 替换,插入,删除。
替换:
word1[i - 1]
被 word2[j - 1]替换,那么:
dp[i][j]=dp[i-1][j-1]+1;
删除:
word1[0..i - 1)=word2[0..j)
,那么删除word1[i - 1]
dp[i][j]=dp[i-1][j]+1;
插入:
word1[0..i) + word2[j - 1] = word2[0..j)
那么把 word2[j - 1]
插入到 word1[0..i)后面
dp[i][j] = dp[i][j - 1] + 1;
代码如下:
AC 4ms 97% Java:
class Solution {
public int minDistance(String word1, String word2) {
int m=word1.length();
int n=word2.length();
if(m==0||n==0)
return Math.max(m,n);
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(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]))+1;
}
}
return dp[m][n];
}
}