LCS 算法
2015-08-14 20:08
417 查看
LCS算法:
寻找俩字符串的最大公共子串
俩个数组a[str1长+1][str2长+1], b[str1长+1][str2长+1]
a记录LCS值 b记录值从哪来的
数组第一行,第一列都初始化为0,其他根据计算而来
字符串相等时,a[i][j]=左上角值+1 b[i][j]记为1 是由左上角而来,所以回溯时 向左上角走
不等时:上面的比左面的大 a[i][j]=上面的值,b[i][j]=2
下面的比上面的大 a[i][j]=下面的值,b[i][j]=3
根据b输出结果
i=str1长 j=str2长
如果 b[i][j]=1 根据左上角来 递归调用i--;j--,输出cout<<str1[i-1];
b[i][j]=2 递归i-1;
b[i][j]=3 递归 j-1;
寻找俩字符串的最大公共子串
俩个数组a[str1长+1][str2长+1], b[str1长+1][str2长+1]
a记录LCS值 b记录值从哪来的
数组第一行,第一列都初始化为0,其他根据计算而来
字符串相等时,a[i][j]=左上角值+1 b[i][j]记为1 是由左上角而来,所以回溯时 向左上角走
不等时:上面的比左面的大 a[i][j]=上面的值,b[i][j]=2
下面的比上面的大 a[i][j]=下面的值,b[i][j]=3
根据b输出结果
i=str1长 j=str2长
如果 b[i][j]=1 根据左上角来 递归调用i--;j--,输出cout<<str1[i-1];
b[i][j]=2 递归i-1;
b[i][j]=3 递归 j-1;
void LCS_print(const char *s1,const char *s2) { if(s1==NULL||s2==NULL) return ; int l1=0,l2=0; l1=strlen(s1)+1; l2=strlen(s2)+1; if(l1==0||l2==0) return 0; int i,j; int **a=new int [l1+1]; int **b=new int [l1+1]; //初始化 for(i=0;i=a[i][j-1]) { a[i][j]=a[i-1][j]; b[i][j]=2; } else { a[i][j]=a[i][j-1]; b[i][j]=3; } } } } LCS(l1-1,l2-1,b,s1,s2); int lcs=a[l1-1][l2-1]; //释放空间 for(i=0;i
相关文章推荐
- HDU 5378 Leader in Tree Land
- 蚂蜂窝特价 v4.4.0 官方安卓版
- Android 入门指引 从零基础学安卓怎么开始
- asp.net mvc dropdownlist
- iOS SDK详解之NSCoding协议
- Codeforces Gym 100379G Wythoff’s game with three piles 博弈
- hdu 4277 USACO ORZ(dfs+剪枝)
- hdu 5381 The sum of gcd 莫队 + DP
- Hdu 2015 Multi-University Training Contest8
- Hit 2255 Not Fibonacci
- URAL-1225 Flags
- 利用curl_multi_init并行多线程处理网络数据
- 很容易学习的JQuery库 : (二) 选择器
- 无常生活,有限奋斗
- 创业
- Max Sum
- hdu - 3594 Cactus (强连通)
- 确定比赛名次--hdoj
- ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池
- HDU-2647 Reward(拓扑排序)