经典的lcs问题(输出公共子序列)
2015-10-23 12:30
260 查看
这个问题疑惑了很久,只知道求公共子序列长度,不会求子序列。
代码贴出如下:
代码贴出如下:
#include<iostream> using namespace std; #include<algorithm> #include<stack> int chang[1000][1000]={}; int flag[1000][1000]={}; char * lcs(char *a,char *b) { int len1=strlen(a); int len2=strlen(b); //for(int i=0;i<=len1;++i) // chang[i][0]=0; //for(int i=0;i<=len2;++i) // chang[0][i]=0; for(int i=1;i<=len1;++i) for(int j=1;j<=len2;++j) { if(a[i-1]==b[j-1]) { chang[i][j]=chang[i-1][j-1]+1; flag[i][j]=0; }else if(chang[i][j-1]>=chang[i-1][j]){ chang[i][j]=chang[i][j-1]; flag[i][j]=-1; }else{ chang[i][j]=chang[i-1][j]; flag[i][j]=1; } } int len3=chang[len1][len2]; char *p=new char[len3+1]; p[len3--]='\0'; //stack<char> zifu; int i=len1; int j=len2; while(j>0&&i>0) { if(flag[i][j]==0){ //zifu.push(b[j-1]); p[len3--]=b[j-1]; i--,j--; }else if(flag[i][j]==-1) { j--; }else if(flag[i][j]==1) i--; } //int len3=zifu.size(); //for(int i=0;i<len3;++i) //{ // p[i]=zifu.top(); // zifu.pop(); //} return p; } int main() { char a[]="cafe"; char b[]="coffee"; char *p=lcs(a,b); cout<<p<<endl; return 0; }
相关文章推荐
- Homestead 使用总结
- 5、WPF 4.5 in VB 界面切换
- Redis学习笔记一、开篇
- PHP网络数据抓取方法
- jvm对大对象分配内存的特殊处理(转)
- 解决Firefox 的Adobe Flash更新问题。
- 移动页面自适应搜索框
- 39.Ugly Number II(动态规划)
- iOS开发~视频处理
- LITTLE SHOP OF FLOWERS
- 分区
- 大道至简第四章
- 关于Linux命令ls的一道笔试题
- 通过dumpsys meminfo命令查看一个进程的内存情况
- 关于rand和srand函数使用的一点心得
- VS2010 DSOFrame 编译遇到的问题总结
- 考虑overflow
- JDBC程序更新数据库中记录的方法
- MyEclipse10安装SVN插件
- 图片 动画