最长公共子序列模版

来源:互联网 发布:大数据可视化解决方案 编辑:程序博客网 时间:2024/05/16 17:01
#include<iostream>#include<string.h>#define maxn 100using namespace std;void fun(char *A,int m,char *B,int n,int a[][maxn],int b[][maxn]){    for(int i=0;i<=m;i++) a[i][0]=0;    for(int i=0;i<=n;i++) a[0][i]=0;    for(int i=1;i<=m;i++)    {        for(int j=1;j<=n;j++)        {            if(A[i-1]==B[j-1])            {                a[i][j]=a[i-1][j-1]+1;                b[i][j]=0;            }            else if(a[i-1][j]>a[i][j-1])            {                a[i][j]=a[i-1][j];                b[i][j]=1;              //行增加,为1            }            else            {                a[i][j]=a[i][j-1];                b[i][j]=-1;             //列增加,为-1            }        }    }}void print(char *A,int m,char *B,int n,int b[][maxn]){    if(m==0||n==0) return ;    else if(b[m][n]==0)    {        print(A,m-1,B,n-1,b);        cout<<A[m-1];    }    else if(b[m][n]==1)    {        print(A,m-1,B,n,b);    }    else    {        print(A,m,B,n-1,b);    }}int main(){    char A[maxn],B[maxn];    int a[maxn][maxn];  //记录每个状态的最大字串长    int b[maxn][maxn];  //记录前驱    int m,n;    cin>>A>>B;    m=strlen(A),n=strlen(B);    fun(A,m,B,n,a,b);    cout<<a[m][n]<<endl;    print(A,m,B,n,b);return 0;}

原创粉丝点击