编辑距离(Minimum Edit Distance)

不少题出现了关于两个字符串差异的问题,后来仔细一查,原来有个专业的术语,叫做 Edit Distance. 

Edit Distance 不仅应用在字符串的比较,在生物领域,例如DNA序列的比对,应用也十分广泛。

解决 Edit Distance 这个问题对于那些精通动态规划的同学来说简直就是小菜一碟,我刚看到 Edit Distance 的时候都被唬住了、、

默默地找了 Stanford 的一份专门讲解 Edit Distance 的 ppt,边学边解决的,没办法,菜鸟只能这样一点一滴地积累了。


首先,关于 Edit Distance 的定义,Edit Distance 主要有三部分操作:插入、删除和替换。

插入和删除的操作为一个单位,替换的操作为两个单位。

《编辑距离(Minimum Edit Distance)》


用动态规划的思想解决 Edit Distance 的问题,其实这真的是最最简单的动态规划问题,建立状态转移方程式如下:

《编辑距离(Minimum Edit Distance)》


然后就是解决这个问题的伪代码了,如下:

《编辑距离(Minimum Edit Distance)》


看,是不是很简单咩,入门级别的,和0/1揹包差不多啦。

附上源代码吧:

#include <iostream>
#include <string>
#define MAX 1010
using namespace std;

int dis[MAX][MAX];

int min(int a, int b, int c)
{
	return a < b ? (a<c?a:c) : (b<c?b:c);    
}

int minDistance(string word1, string word2)
{
	//memset(dis, 0, sizeof(dis));
	int len1 = word1.length(), len2 = word2.length();

	for (int i = 0; i < len1; i++)
		dis[i][0] = i;
	for (int i = 0; i < len2; i++)
		dis[0][i] = i;

	for (int i = 1; i < len1; i++)
	{
		for (int j = 1; j < len2; j++)
		{
			if (word1[i] == word2[j])
				dis[i][j] = min(dis[i-1][j]+1, dis[i][j-1]+1, dis[i-1][j-1]);
			else
				dis[i][j] = min(dis[i-1][j]+1, dis[i][j-1]+1, dis[i-1][j-1]+2);
		}
	}
	return dis[len1-1][len2-1];
}

int main()
{
	string str1, str2;
	cin >> str1 >> str2;
	cout << minDistance(str1, str2) << endl;

	system("pause");
	return 0;
}


勤勤恳恳,每天都努力一点、都进步一点,会有成长的,相信自己!

点赞