int[][] memo = null; // 备忘录
int solve(String word1, String word2, int c1, int c2)
{
int a, b, c ;
int n1 = word1.length();
int n2 = word2.length();
if (c1 == n1 && c2 == n2)
return 0;
if (c1 == n1)
return n2-c2; // 添上缺失的c2的部分
if (c2 == n2)
return n1-c1; // 砍掉c1后面的字符
// 如果计算过
if (memo[c1][c2] != 0)
return memo[c1][c2];
if (word1.charAt(c1) == word2.charAt(c2))
{
return solve(word1, word2, c1+1, c2+1); // 继续比较下一个字符
}
else
{
a = solve(word1, word2, c1, c2+1); // 插入一个字符
b = solve(word1, word2, c1+1, c2+1); // 替换一个字符
c = solve(word1, word2, c1+1, c2); // 删除一个字符
memo[c1][c2] = min(a, b, c) + 1;
return memo[c1][c2];
}
}
int min(int x, int y, int z)
{
return Math.min(Math.min(x, y), z);
}
public int minDistance(String word1, String word2)
{
if (word1.isEmpty())
return word2.length();
if (word2.isEmpty())
return word1.length();
// 初始化备忘录
memo = new int[word1.length()+1][word2.length()+1];
return solve(word1, word2, 0, 0);
}