字符串间最短距离(动态规划)
来源:互联网 发布: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;}
- 字符串间最短距离(动态规划)
- 字符串间最短距离(动态规划)
- 字符串最短距离CalculateStringDistance(递归 or 动态规划)
- 算法之美——求解 字符串间最短距离(动态规划)
- 算法之美——求解 字符串间最短距离(动态规划)
- 动态规划之最短距离
- 动态规划之任意顶点间最短距离
- 字符串最短距离问题
- 求解字符串间最短距离(字符串相似度)
- 求解字符串间最短距离(字符串相似度)
- 字符串之间的最短距离
- 字符串的修改(动态规划-最短编辑距离)
- 线段间最短距离
- 求两点间最短距离
- 相似字符串(字符串编辑)最短距离(非递归版本)
- POJ 1125 Stockbroker Grapevine(floyd两点间最短距离)
- 迪杰斯特拉算法(找到两点间的最短距离)
- 最短距离
- 2
- oracle11.2.0.4 impdp导入报错:ORA-39083,ORA-02304
- linux 下面如何安装Eigen
- 合并石子(三重dp)
- 心少朴-新
- 字符串间最短距离(动态规划)
- LeetCode之Two Sum
- JSON学习笔记(格式/第三方库jsonCpp与libJson的配置和使用) cocos2d-x
- STL常用容器模板
- Android Studio 2.x源码关联
- 02 原 Win10下安装VS2013出现“win10 windows兼容性模式已打开 请将其关闭”错误的解决办法
- 瑞芯微RK3399宣布系统开源
- JVM 的 工作原理,层次结构 以及 GC工作原理
- 初一下学期目标