编辑距离:指将一个对象编辑为另一个对象的操作次数或代价。
如:字符串 view 到 new 的编辑距离为2。 (删除v,将i该为n)
动态规划求编辑距离
记s1字符串长度为n1,s2字符串长度为n2,记d[ i , j ] 表示s1前 i 个字符所构成的前缀与s2的前 j 个字符所构成的前缀之间的编辑距离。
d[n1 , n2]即为最终解。
如果其中一个串为空串,则编辑距离为另一个串的长度。
若都不是空串,则有以下递推式 (s(i) 表示s的第 i 个字符)
public class DP {
public void calcDistance(String s1, String s2) {
int n1 = s1.length() + 1;
int n2 = s2.length() + 1;
if (n1 == 1 || n2 == 1) {
System.out.println(Math.max(n1, n2) - 1);
return;
}
char c1[] = s1.toCharArray();
char c2[] = s2.toCharArray();
int d[][] = new int[n1][n2];
int i, j;
for (j = 0; j < n2; j++) {
d[0][j] = j;
}
for (i = 1; i < n1; i++) {
d[i][0] = i;
for (j = 1; j < n2; j++) {
if (c1[i - 1] == c2[j - 1]) {
d[i][j] = d[i - 1][j - 1];
} else {
d[i][j] = Math.min(d[i][j - 1],
Math.min(d[i - 1][j], d[i - 1][j - 1])) + 1;
}
}
}
// 输出结果
System.out.println(d[n1 - 1][n2 - 1]);
}
public static void main(String[] args) {
DP dp = new DP();
dp.calcDistance("view", "new");
dp.calcDistance("view", "aaaaa");
dp.calcDistance("view", "view");
dp.calcDistance("view", "");
}
}