这个问题疑惑了很久,只知道求公共子序列长度,不会求子序列。
代码贴出如下:
#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;
}