不少题出现了关于两个字符串差异的问题,后来仔细一查,原来有个专业的术语,叫做 Edit Distance.
Edit Distance 不仅应用在字符串的比较,在生物领域,例如DNA序列的比对,应用也十分广泛。
解决 Edit Distance 这个问题对于那些精通动态规划的同学来说简直就是小菜一碟,我刚看到 Edit Distance 的时候都被唬住了、、
默默地找了 Stanford 的一份专门讲解 Edit Distance 的 ppt,边学边解决的,没办法,菜鸟只能这样一点一滴地积累了。
首先,关于 Edit Distance 的定义,Edit Distance 主要有三部分操作:插入、删除和替换。
插入和删除的操作为一个单位,替换的操作为两个单位。
用动态规划的思想解决 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;
}
勤勤恳恳,每天都努力一点、都进步一点,会有成长的,相信自己!