今天见到一个题,让求两个字符串之间的距离,隐约记得之前在 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 的影子的