import java.util.*;
/** 编辑距离
* 给定两个单词word1和word2,请计算将word1转换为word2至少需要多少步操作。
* 你可以对一个单词执行以下3种操作:
* a)在单词中插入一个字符
* b)删除单词中的一个字符
* c)替换单词中的一个字符
* 状态: 将word1的前i个字符变为word2的前j个字符需要多少步 f(i, j)
* 分析: 三种操作 i: 插入操作: f(i, j-1) ->f(i, j)
* d: 删除操作: f(i-1, j)+1 ->f(i, j)
* r: 替换操作: 1. word1[i] != word2[j]时: f(i-1, j-1) -> f(i, j)
* 三种操作中取最小值
* 转移方程: f(i, j) = min( f(i-1, j), f(i+1, j))
* if(word1[i]!=word[j]) f(i-1,j-1)+1
* else f(i-1, j-1)+1 -> f(i, j)
* 初始状态: f[0][i] = i
* f[i][0] = i
*/
public class Solution {
public int minDistance (String word1, String word2) {
// write code here
if(word1.isEmpty() || word2.isEmpty()){
return Math.max(word1.length(), word2.length());
}
int row = word1.length();
int col = word2.length();
int [][]mind = new int[row+1][col+1];
//初始化
for(int i=0;i<=row;i++){
mind[i][0]=i;
}
for(int i=0;i<=col;i++){
mind[0][i]=i;
}
for(int i=1; i<=row;i++){
for(int j=1; j<=col ;j++){
mind[i][j] = Math.min(mind[i][j-1], mind[i-1][j])+1;
if(word1.charAt(i-1) == word2.charAt(j-1)){
mind[i][j] = Math.min(mind[i][j], mind[i-1][j-1]);
} else {
mind[i][j] = Math.min(mind[i][j], mind[i-1][j-1]+1);
}
}
}
return mind[row][col];
}
}