P30 编辑距离
算法 25 阅读
信号摘要
难度:Hard · 时长:10:08 · leetcode 72 · lintcode 119
未对外公开播放权限
点击查看说明
描述
这个题目说的是,给你两个字符串,你要求出由其中一个字符串转成另一个所需要的最少编辑操作次数。允许的操作有 3 种,分别是:替换一个字符,插入一个字符和删除一个字符。
比如说,给你的两个字符串是 car 和 ba。s1: car s2: ba
你要把 car 转成 ba,需要先把 c 替换成 b,然后再删除 r。总共操作 2 次,因此它们的编辑距离是 2。
代码
public class AlgoCasts {
private int min(int a, int b, int c) {
return Math.min(a, Math.min(b, c));
}
// Time: O(m*n), Space: O(m*n)
public int editDistance(String s, String t) {
if (s == null || t == null) return 0;
int m = s.length() + 1, n = t.length() + 1;
int[][] d = new int[m][n];
for (int i = 0; i < m; ++i)
d[i][0] = i;
for (int j = 0; j < n; ++j)
d[0][j] = j;
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
if (s.charAt(i-1) == t.charAt(j-1)) {
d[i][j] = d[i-1][j-1];
} else {
d[i][j] = min(d[i-1][j-1], d[i-1][j], d[i][j-1]) + 1;
}
}
}
return d[m-1][n-1];
}
// Time: O(m*n), Space: O(n)
public int editDistance1dArray(String s, String t) {
if (s == null || t == null) return 0;
int m = s.length() + 1, n = t.length() + 1;
int[] d = new int[n];
for (int j = 0; j < n; ++j)
d[j] = j;
for (int i = 1; i < m; ++i) {
int pre = d[0];
d[0] = i;
for (int j = 1; j < n; ++j) {
int tmp = d[j];
if (s.charAt(i-1) == t.charAt(j-1)) {
d[j] = pre;
} else {
d[j] = min(pre, d[j], d[j-1]) + 1;
}
pre = tmp;
}
}
return d[n-1];
}
}