您的位置:首页 > 其它

经典的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: