今天见到一个题,让求两个字符串之间的距离,隐约记得之前在 php 中用过这个的现成函数,当时还查了一下原理,是一个俄罗斯的人搞的一个算法,原理是用矩阵,于是就往矩阵上去想,结果没想出来,后来听同学说那是个 dp,想想也是,唉,思路狭隘了
参考这里,http://www.java3z.com/cwbwebho…,写了一个矩阵的版本,写的时候注意一下二维数组的操作
#include <stdio.h>
#include <string.h>
inline int min(int a, int b, int c) {
if (a<=b && a<=c) {
return a;
} else if (b<=a && b<=c) {
return b;
} else {
return c;
}
}
int ld(char *str1, char *str2) {
int len1=strlen(str1), len2=strlen(str2);
if (len1 == 0) {
return len2;
}
if (len2 == 0) {
return len1;
}
int **d;
// create 2d array
d = new int*[len1+1];
for (int i=0; i<len1+1; i++) {
d[i] = new int[len2+1];
}
// init 2d array
for (int i=0; i<len1+1; i++) {
d[i][0] = i;
}
for (int i=0; i<len2+1; i++) {
d[0][i] = i;
}
// Levenshtein distance
for (int i=1; i<=len1; i++) {
for (int j=1; j<=len2; j++) {
int is_diff = 0;
if (str1[i-1] == str2[j-1]) {
is_diff = 0;
} else {
is_diff = 1;
}
d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+is_diff);
}
}
int ans = d[len1][len2];
// delete 2d array
for (int i=0; i<len1+1; i++) {
delete[] d[i];
}
delete[] d;
d = NULL;
return ans;
}
int main() {
char str1[] = "bambol";
char str2[] = "umbo";
printf("%dn", ld(str1, str2));
return 0;
}
可以看到说是矩阵其实还是有 dp 的影子的