描述
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。
许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。
/*
*
动态规划思路为:
* 设Ai为字符串A(a1a2a3 … am)的前i个字符(即为a1,a2,a3 … ai)
* 设Bj为字符串B(b1b2b3 … bn)的前j个字符(即为b1,b2,b3 … bj)
*
* 设 L(i,j)为使两个字符串和Ai和Bj相等的最小操作次数。
* 当ai==bj时 显然 L(i,j) = L(i-1,j-1)
* 当ai!=bj时
* 若将它们修改为相等,则对两个字符串至少还要操作L(i-1,j-1)次
* 若删除ai或在bj后添加ai,则对两个字符串至少还要操作L(i-1,j)次
* 若删除bj或在ai后添加bj,则对两个字符串至少还要操作L(i,j-1)次
* 此时L(i,j) = min( L(i-1,j-1), L(i-1,j), L(i,j-1) ) + 1
*
* 显然,L(i,0)=i,L(0,j)=j, 再利用上述的递推公
* */
private static int stringDistance(char[] a, char[] b) {
int[][] len = new int[a.length+1][b.length+1];
//L(i,0)=i
for(int i = 0; i<= a.length; i++) {
len[i][0] = i;
}
//L(0,j)=j
for(int j = 0; j<= b.length; j++) {
len[0][j] = j;
}
for(int i = 1; i <= a.length; i++) {
for(int j = 1; j<= b.length; j++) {
//当ai==bj时 显然 L(i,j) = L(i-1,j-1)
if(a[i-1]== b[j-1]){
len[i][j] = len[i-1][j-1];
}else {//当ai!=bj时
len[i][j] = Math.min(Math.min(len[i-1][j-1], len[i-1][j]), len[i][j-1]) + 1;
}
}
}
return len[a.length][b.length];
}