您的位置:首页 > 其它

字符串间最短距离(动态规划)

2017-02-24 20:26 387 查看
Minimum Edit Distance 问题

对于不同的字符串,判断其相似度。

定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:

  1.修改一个字符(如把“a”替换为“b”)

  2.增加一个字符(如把“abdd”变为“aebdd”)

  3.删除一个字符(如把“travelling”变为“traveling”)

   定义:把这个操作所需要的最少次数定义为两个字符串的距离,而相似度等于“距离+1”的倒数

采用递归的思想将问题转化成规模较小的同样的问题。

u 如果两个串的第一个字符相同,如A=xabcdae和B=xfdfa,只要计算

A[2,…,7]=abcdae和B[2,…,5]=fdfa的距离就可以了。

u 如果两个串的第一个字符不相同,那么可以进行如下的操作:

1.删除A串的第一个字符,然后计算A[2,…,lenA]和B[1,…,lenB]的距离。

2.删除B串的第一个字符,然后计算A[1,…,lenA]和B[2,…,lenB]的距离。

3.修改A串的第一个字符为B串的第一个字符,然后计算A[2,…,lenA]和

B[2,…,lenB]的距离。

4.修改B串的第一个字符为A串的第一个字符,然后计算A[2,…,lenA]和

B[2,…,lenB]的距离。

5.增加B串的第一个字符到A串的第一个字符之前,然后计算

A[1,…,lenA]和B[2,…,lenB]的距离。

6.增加A串的第一个字符到B串的第一个字符之前,然后计算

A[2,…,lenA]和B[1,…,lenB]的距离。

  

我们并不在乎两个字符串变得相等之后的字符串是怎样的。

可以将上面6个操作合并为:

1.一步操作之后,再将A[2,…,lenA]和B[1,…,lenB]变成相同字符串。

2.一步操作之后,再将A[1,…,lenA]和B[2,…,lenB]变成相同字符串。

3.一步操作之后,再将A[2,…,lenA]和B[2,…,lenB]变成相同字符串。

示例代码如下:

#include <iostream>
#include<string.h>

using namespace std;

int Minvalue(int x,int y,int z)
{
int Min=x;
if(y<Min)
{
Min=y;
}
if(z<Min)
{
Min=z;
}
return Min;
}

int CaculateStringDistance(const char* X,size_t PxBegin,size_t PxEnd,const char* Y,size_t PyBegin,size_t PyEnd)
{
if(PxBegin>PxEnd)
{
if(PyBegin>PyEnd)
return 0;
else
return PyEnd-PyBegin+1;
}
if(PyBegin>PyEnd)
{
if(PxBegin>PxEnd)
return 0;
else
return PxEnd-PxBegin+1;
}
if(X[PxBegin]==Y[PyBegin])
{
return CaculateStringDistance(X,PxBegin+1,PxEnd,Y,PyBegin+1,PyEnd);
}
else
{
int t1=CaculateStringDistance(X,PxBegin+1,PxEnd,Y,PyBegin,PyEnd);
int t2=CaculateStringDistance(X,PxBegin,PxEnd,Y,PyBegin+1,PyEnd);
int t3=CaculateStringDistance(X,PxBegin+1,PxEnd,Y,PyBegin+1,PyEnd);
return Minvalue(t1,t2,t3);
}
}

int main()
{
char X[10]={'b','c','b','d','c','v','b'};
char Y[10]={'b','c','b','d','c'};
cout<<"The Distrance of two strings is:"<<CaculateStringDistance(X,0,strlen(X)-1,Y,0,strlen(Y)-1)<<endl;

return 0;
}


稍微修改后,更简洁的代码如下:

#include <iostream>
#include<string.h>

using namespace std;

int Minvalue(int x,int y,int z)
{
int Min=x;
if(y<Min)
{
Min=y;
}
if(z<Min)
{
Min=z;
}
return Min;
}
int Max(int x,int y)
{
return x>y?x:y;
}

int CaculateStringDistance_2(const char* X,const char* Y)
{
int len1=strlen(X);
int len2=strlen(Y);

if(len1==0||len2==0)
{
return Max(len1,len2);
}
else
{
if(X[0]==Y[0])
{
return CaculateStringDistance_2(X+1,Y+1);
}
else
{
return Minvalue(CaculateStringDistance_2(X,Y+1),CaculateStringDistance_2(X+1,Y),CaculateStringDistance_2(X+1,Y+1))+1;
}
}
}

int main()
{
char X[10]={'b','c','b','d','c','v','b'};
char Y[10]={'a','c','b','d','c'};
cout<<"The Distrance of two strings is:"<<CaculateStringDistance_2(X,Y)<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划