字符串距离

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

Leave a Reply

Your email address will not be published. Required fields are marked *