描述
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。
Ex:
字符串A:abcdefg
字符串B: abcdef
通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。
要求:
给定任意两个字符串,写出一个算法计算它们的编辑距离。
本题含有多组输入数据。
输入描述:
每组用例一共2行,为输入的两个字符串
输出描述:
每组用例输出一行,代表字符串的距离
示例1
输入:
abcdefg
abcdef
abcde
abcdf
abcde
bcdef
输出:
1
1
2
代码
public class Huawei计算字符串距离Dp {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(distance(str.toCharArray(), br.readLine().toCharArray()));
}
}
/**
* lev[i][j]用来表示字符串a的[1...i]和字符串b[1...j]的levenshtein距离;
* 插入和删除操作互为逆过程:a删除指定字符变b等同于b插入指定字符变a;
* 1,如果a[i] == b[j],则说明a[i]和b[j]分别加入a,b之后不会影响levenshtein距离,lev[i][j] = lev[i-1][j-1] + 0;
* 2,如果a[i] != b[j],则需要考虑3种情况的可能:
* ,a中插入字符,即lev[i][j] = lev[i-1][j] + 1;
* ,b中插入字符,即lev[i][j] = lev[i][j-1] + 1;
* ,a[i]替换成b[j],lev[i][j] = lev[i-1][j-1] + 1;
* 3,取这4种情况的最小值。
* @param arr1
* @param arr2
* @return
*/
private static int distance(char[] arr1, char[] arr2) {
int[][] distances = new int[arr1.length + 1][arr2.length + 1];
for (int i = 1; i <= arr1.length; i++) distances[i][0] = i;
for (int i = 1; i <= arr2.length; i++) distances[0][i] = i;
for (int i = 1; i <= arr1.length; i++) {
for (int j = 1; j <= arr2.length; j++) {
if (arr1[i - 1] == arr2[j - 1]) {
distances[i][j] = distances[i - 1][j - 1];
} else {
distances[i][j] = Math.min(Math.min(distances[i - 1][j], distances[i][j - 1]), distances[i - 1][j - 1]) + 1;
}
}
}
return distances[arr1.length][arr2.length];
}
}