给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。
你总共三种操作方法:
- 插入一个字符
- 删除一个字符
- 替换一个字符
样例
参考:
给出 work1="mart" 和 work2="karma"
返回 3
分析:
动态规划:用dp(i, j)表示word1的字串(前 i 个字符组成)和 word2的字串(前 j 个字符组成)的编辑距离。
则 dp(0, j) = j,即插入 j 个字符
dp(i, 0) = i,即删除 i 个字符
dp(i, j) = dp(i-1, j-1), if word1[i]==word2[j], just stay as it is
= min(dp(i-1, j-1), dp(i-1, j), dp(i, j-1))+1, if word1[i] != word2[j], then 取 replace, delete 和 insert中的代价最小的
代码:
public class Solution {
/**
* @param word1 & word2: Two string.
* @return: The minimum number of steps.
*/
public int minDistance(String word1, String word2) {
// write your code here
int len1 = word1.length();
int len2 = word2.length();
int[][] dp = new int[len1+1][len2+1];
for(int i=0;i<=len2;++i)
dp[0][i] = i;
for(int i=0;i<=len1;++i)
dp[i][0] = i;
for(int i=1;i<=len1;++i)
for(int j=1;j<=len2;++j){
char src = word1.charAt(i-1);
char dest = word2.charAt(j-1);
if(src==dest) //stay
dp[i][j] = dp[i-1][j-1];
else
dp[i][j] = Math.min(Math.min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1])+1;
// replace,delete and add
}
return dp[len1][len2];
}
}
参考:
http://blog.csdn.net/fisher_jiang/article/details/2487688