动态规划-编辑距离问题
2013-03-23 23:07
295 查看
一、问题描述
设A和B是两个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符;
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的两个字符串A和B,计算出它们的编辑距离d(A,B)。
设A和B是两个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符;
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的两个字符串A和B,计算出它们的编辑距离d(A,B)。
#include <iostream> #include <algorithm> const int MAXLEN =100; #define Match 1 #define Insert 2 #define Delete 3 class EditDistance { typedef struct Cell { int cost; int parant; }cell_t; public: EditDistance() { memset(m,0,sizeof(int)*MAXLEN*MAXLEN); for(int i=1;i!=MAXLEN;i++){ m[i][0].cost=i; m[i][0].parant=Insert; m[0][i].cost=i; m[0][i].parant=Insert; } m[0][0].parant=-1; } //m[i][j]=min{m[i-1][j-1]+match(s[i],[j]),m[i][j-1]+1,m[i-1][j]+1} int excute(char* s,char* t) { int opt[4]; int len_s=strlen(s); int len_t=strlen(t); for(int i=1;i!=len_s;i++){ for(int j=1;j!=len_t;j++){ opt[Match]=m[i-1][j-1].cost+match(s[i],t[j]); opt[Insert]=m[i][j-1].cost+1; opt[Delete]=m[i-1][j].cost+1; m[i][j].cost=std::min(std::min(opt[Match],opt[Insert]),opt[Delete]); } } return m[len_s-1][len_t-1].cost; } ~EditDistance() { } private: int match(char i,char j) { if(i==j){ return 0; } return 1; } cell_t m[MAXLEN][MAXLEN]; }; int main() { char s[]="asdffd"; char t[]="aedfad"; EditDistance distance; int res=distance.excute(s,t); std::cout<<res<<std::endl; getchar(); }
相关文章推荐
- Java动态规划之编辑距离问题示例代码
- 动态规划之编辑距离问题
- 动态规划之最小编辑距离问题
- 动态规划之编辑距离问题
- 动态规划之编辑距离问题
- 动态规划问题学习路线:斐波那契数列,最大递增子序列,松鼠捡苹果,最大公共子序列,字符串编辑距离
- 动态规划之最大k乘积,编辑距离,k好数,节点选择,背包问题
- 动态规划4-编辑距离问题
- 动态规划:编辑距离问题
- 51nod动态规划入门--编辑距离问题
- 动态规划——最短编辑距离
- 动态规划实例(八):最小编辑距离
- 编辑距离(动态规划经典)
- 动态规划之最长公共子序列和编辑距离
- 动态规划---最短编辑距离
- 动态规划---最短编辑距离
- 动态规划 字符串编辑距离
- 动态规划之寻找编辑距离
- 动态规划:编辑距离和通配符匹配
- 51NOD 1183——编辑距离(动态规划基础)