描述
给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。
你总共三种操作方法:
- 插入一个字符
- 删除一个字符
- 替换一个字符
样例
给出 work1="mart" 和 work2="karma"
返回 3
思路
使用dp, 先定义状态 f(i)(j) 单词1 的前i个 跟 单词2 的前j个 的最短编辑距离。如果 a[i] == b[j] , 那么f(i,j) = f(i-1,j-1)。
然后,再看有三种状态:
1. 增加一个 : 等价于 f(i, j-1)
2. 删除一个 : 等价于 f(i-1, j)
3. 修改一个 : 等价于 f(i-1, j-1)
那么状态转移方程就很显而易见了吧:
if a[i] == b[j] , f (i, j) = f(i-1,j-1) ,
else f (i, j) = min( f(i ,j-1) , f(i-1,j-1) ,f(i-1,j) ) + 1.
代码:
public int minDistance(String word1, String word2) {
// write your code here
int[][] dp = new int[word1.length()+1][word2.length()+1];
for (int i = 0; i <= word1.length(); i++) {
dp[i][0] = i;
}
for (int j = 0; j <= word2.length(); j++) {
dp[0][j] = j;
}
for (int i = 1; i <= word1.length() ; i++) {
for (int j = 1; j<=word2.length(); j++){
if(word1.charAt(i-1)==word2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1];
}else {
int min = dp[i-1][j] < dp[i][j-1] ? dp[i-1][j] : dp[i][j-1];
dp[i][j] = (dp[i-1][j-1] < min ? dp[i-1][j-1] : min) + 1;
}
}
}
return dp[word1.length()][word2.length()];
}