LCS算法的C++实现
来源:互联网 发布:mac翻墙回国的软件 编辑:程序博客网 时间:2024/05/29 15:11
这两天忙里偷闲看了July的团队提供的LCS算法视频,真的如视频标题一样,十分钟搞定LCS算法。
感谢July大神,感谢其团队的邹博。
这里附上视频链接:http://www.julyedu.com/video/play?course=17
说是十分钟搞定,其实是不包括程序实现部分。视频中队程序部分没有做讲解,而且PPT中提供的原码貌似是 Pascal 的?
因此我自己用C++做了其算法的实现,关于算法的分析就看视频吧,讲解真的很详细。
目标一:
实现下图中的矩阵
首先根据要比较的x,y字符串构造二维数组c,维度是x和y的长度+1,用于记录最长公共子序列长度
xlen=x.length();ylen=y.length();int c[xlen+1][ylen+1];
接着是n数组,记录方向,我用0代表左,1代表上,2代表左上
int n[xlen][ylen];//0-left 1-top 2-left-top
对于c数组,将第0行和第0列赋值为0
for(i=0;i<=xlen;i++) c[i][0]=0;for(j=0;j<=ylen;j++) c[0][j]=0;
然后是一个二重循环,给数组c和n赋值
c数组依据的公式是
n[i,j]取值的依据是
如果x(i-1)=y(j-1),那么n[i,j]=2;
如果x(i-1)!=y(j-1),且c[i-1,j]>=c[i,j-1],那么n[i,j]=1;
如果x(i-1)!=y(j-1),且c[i-1,j]<c[i,j-1],那么n[i,j]=0;
因此:
for(i=1;i<=xlen;i++) { for(j=1;j<=ylen;j++) { if(x.at(i-1)==y.at(j-1)) { c[i][j]=c[i-1][j-1]+1; n[i-1][j-1]=2; } else { c[i][j]=c[i-1][j]>c[i][j-1]?c[i-1][j]:c[i][j-1]; n[i-1][j-1]=c[i-1][j]>=c[i][j-1]?1:0; } } }
到此已经完成了对c,n数组的赋值。n的最后一个数就存储着最长公共子序列的长度
根据n的方向指示,就可以找出最长公共子序列
i=xlen-1; j=ylen-1; while(1) { if(i==0||j==0) { if(n[i][j]==2) s+=x.at(i); break; } if(n[i][j]==0) { j--; } else if(n[i][j]==1) { i--; } else { s+=x.at(i); i--; j--; } }
上面的while循环给出的字符串s并不是最长公共子序列,而是其反序的结果,因此将其反向输出就是我们要的结果了
for(i=s.length()-1;i>=0;i--) cout<<s.at(i)<<" ";
源程序GitHub地址:https://github.com/hebecherish/lcs/
1 0
- LCS算法的C++实现
- Hirschberg的LCS算法实现
- LCS算法的python实现
- LCS算法的C++实现
- 【算法】LCS算法以及其JAVA的实现
- LCS 算法的改进
- LCS 算法之C++实现
- LCS算法的两种JAVA实现方式
- 算法导论中LCS的C++实现程序
- 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。C实现
- LCS算法(动态规划实现最长公共子序列)c语言实现
- LCS的动态规划算法
- LCS的做备忘录算法
- LCS 最长公共字串算法实现
- c实现的算法
- LCS算法
- LCS算法
- LCS 算法
- 浅谈iOS设计模式之单例模式
- MySql自动备份数据库, 数据库主(master)从(slave)配置
- 第11周-八边形Octagon类
- Lodop(V6.x)使用说明及样例
- 【转载】CSS3 常用四个动画(旋转、放大、旋转放大、移动)
- LCS算法的C++实现
- xml解析之pull
- 获得spring源码
- 如何用PHPExcel读取超大excel文件
- test
- ubuntu下安装eclipse不显示菜单栏
- Linux安装nginx
- UITabBarController简单介绍
- py2exe使用方法