经典的lcs问题(输出公共子序列)

来源:互联网 发布:mac苹果应用商店下载 编辑:程序博客网 时间:2024/06/07 18:01

这个问题疑惑了很久,只知道求公共子序列长度,不会求子序列。

代码贴出如下:



#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;}


0 0