1.自顶向下的递归
超时了,因为递归时进行了很多重复计算
class Solution {
public int minDistance(String word1, String word2) {
/*
操作可以简化为以下3种:
1.对A进行插入
2.对A进行删除
3.对A进行替换
*/
//自顶向下的递归 超时。。
//每次比较最后一个字符
if(word1.length() * word2.length() == 0)//有一个字符串为空
return Math.max(word1.length(), word2.length());
if(word1.charAt(word1.length()-1) == word2.charAt(word2.length()-1))
return minDistance(word1.substring(0, word1.length()-1), word2.substring(0, word2.length()-1));
return 1 + Math.min(Math.min(
minDistance(word1, word2.substring(0, word2.length()-1)), //对A进行插入
minDistance(word1.substring(0, word1.length()-1), word2)), //对A进行删除
minDistance(word1.substring(0, word1.length()-1), word2.substring(0, word2.length()-1))//对A进行替换
);
}
}
2.自底向上的动态规划
class Solution {
public int minDistance(String word1, String word2) {
/*
操作可以简化为以下3种:
1.对A进行插入
2.对A进行删除
3.对A进行替换
*/
//自底向上的动态规划
int m = word1.length(), n = word2.length();
if(m*n == 0) return m+n;
int[][] op = new int[m+1][n+1];//op[i][j]表示s1[0...i-1]到s2[0...j-1]的最少步骤
//op[i][j] = min(op[i][j-1], op[i-1][j], op[i-1][j-1]) op[0][i]表示s1为空串!
for(int i = 0;i < m+1;i++)//0表示空!
op[i][0] = i;
for(int j = 0;j < n+1;j++)
op[0][j] = j;
for(int i = 1;i < m+1;i++){
for(int j = 1;j < n+1;j++){
if(word1.charAt(i-1) == word2.charAt(j-1))
op[i][j] = op[i-1][j-1];
else
op[i][j] = 1 + Math.min(Math.min(op[i][j-1], op[i-1][j]), op[i-1][j-1]);
}
}
return op[m][n];
}
}