字符串间最短距离(动态规划)
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]变成相同字符串。
示例代码如下:
稍微修改后,更简洁的代码如下:
对于不同的字符串,判断其相似度。
定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:
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; }
相关文章推荐
- 算法之美——求解 字符串间最短距离(动态规划)
- 算法之美——求解 字符串间最短距离(动态规划)
- 字符串间最短距离(动态规划)
- 字符串的修改(动态规划-最短编辑距离)
- 字符串最短距离CalculateStringDistance(递归 or 动态规划)
- 相似字符串(字符串编辑)最短距离(非递归版本)
- [LeetCode]Word Ladder 最短距离字符串转换 (Dijkstra)
- 24字符串最短编辑距离
- [leetcode 244] Shortest Word Distance II------------字典中两个字符串的最短距离
- 动态规划:字符串的编辑距离
- 动态规划(最小字符串编辑距离实现)
- 基于动态规划(dynamic programming)的计算两个字符串的编辑距离
- 最短编辑距离算法(字符串比较)
- 求两个字符串的最短编辑距离
- 字符串最短距离问题
- [LeetCode]Word Ladder 字符串的最短转换距离 (Dijkstra)
- 《动态规划》之--字符串比较问题(扩展距离)
- 求解字符串间最短距离(字符串相似度)
- 动态规划之最短距离
- 字符串算法:最长公共子序列、最短编辑距离等