给你两个单词word1,word2,使用最少的次数将word1转化为word2。你只可以进行下面三种操作:
1、插入一个字符 2、删除一个字符 3、替换到一个字符。
递归求解(记忆化搜索)
class Solution {
int[][] memoized = null; // 备忘录
public int minDistance(String word1, String word2)
{
// 初始化备忘录
memoized = new int[word1.length()][word2.length()];
for (int[] item: memoized)
{
Arrays.fill(item, -1); // 为每一维数组赋初始值
}
int n = word1.length();
int m = word2.length();
if (word1.isEmpty())
return word2.length();
if (word2.isEmpty())
return word1.length();
return opearte(n-1, m-1, word1, word2);
// int a = 0, b = 0, c = 0;
// a = opearte(x1-1, y1, word1, word2) + 1; // 删除word[x1]
// b = opearte(x1-1, y1-1, word1, word2) + 1; // 替换word[x1]
// c = opearte(x1, y1-1, word1, word2) + 1; // 插入word[x1]
}
// 从后向前逐个比较
/**
* @param x1
* @param y1
* @param word1 原始字符串
* @param word2 目标字符串
*/
int opearte(int x1, int y1, String word1, String word2)
{
/*考虑边界条件*/
// 原始字符串遍历到最后
if (x1 == -1)
return y1+1;
// 目标字符串遍历到了最后
if (y1 == -1)
return x1+1;
if (memoized[x1][y1] != -1)
return memoized[x1][y1];
if (word1.charAt(x1) == word2.charAt(y1))
memoized[x1][y1] = opearte(x1-1, y1-1, word1, word2);
else
memoized[x1][y1] = min(opearte(x1-1, y1, word1, word2),
opearte(x1-1, y1-1, word1, word2),
opearte(x1, y1-1, word1, word2)) + 1;
return memoized[x1][y1];
}
public int min(int a, int b, int c)
{
return Math.min(Math.min(a, b), c);
}
}