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

来源:互联网 发布:linux命令自动补全 编辑:程序博客网 时间:2024/06/07 09:31

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;}
0 0
原创粉丝点击