做这种题,脑子要立刻想到那个二维图,一般当前点由正上方,斜左上方,左边三个点决定,然后给临界边赋值,如第一行,第一列。
代码Java
class Solution {
// 从右往左
// 删除字符(i-1,j) insert(i,j-1) replace(i-1,j-1)
public int minDistance(String word1, String word2) {
// char[] s1 = word1.toCharArray();
// char[] s2 = word2.toCharArray();
// int l1 = s1.length;
// int l2 = s2.length;
// int[][] f = new int[l1+1][l2+1];
// for(int j = 0; j < l2; j++ ) {
// f[0][j+1] = j+1;
// }
// for(int i = 0; i < l1; i++) {
// f[i+1][0] = i + 1;
// for(int j = 0; j < l2; j++) {
// f[i+1][j+1] = s1[i] == s2[j] ? f[i][j] :
// Math.min(Math.min(f[i][j], f[i][j+1]), f[i+1][j]) + 1; //分别是替换,删除,增加
// }
// }
// return f[l1][l2];
char[] s1 = word1.toCharArray();
char[] s2 = word2.toCharArray();
int l1 = s1.length;
int l2 = s2.length;
int[] f = new int[l2+1];
for(int j = 0; j < l2; j++ ) {
f[j+1] = j+1;
}
for(int i = 0; i < l1; i++) {
int pre = f[0];
f[0] = i + 1; // 等价于 f[i+1][0] = i+1
for(int j = 0; j < l2; j++) {
int tmp = f[j+1];
f[j+1] = s1[i] == s2[j] ? pre :
Math.min(Math.min(pre, f[j+1]), f[j]) + 1; //分别是替换,删除,增加
pre = tmp;
}
}
return f[l2];
}
}
收起