输出最长公共子序列

来源:互联网 发布:mac 隐藏文件夹显示 编辑:程序博客网 时间:2024/04/30 10:35

给定字符串  输出最大的公共子序列  如果有多个输出任意一个  如果没有就输出0

#include<stdio.h>
#include<string.h>
int a[100][100];
char str1[1000];
int k=0,flag;
void ok(int m,int n)
{
    //printf("%d %d\n",m,n);
    if(m==0||n==0)
        return ;
    if(a[m][n]==0)
    {
        flag=1;
        ok(m-1,n-1);
        printf("%c",str1[m]);
    }
    else if(a[m][n]==1)
    {
        ok(m,n-1);
    }
    else
    {
        ok(m-1,n);
    }
}
int main()
{
    char str2[1000];
    int i,j,m,n,dp[105][105];
    while(scanf("%s%s",str1+1,str2+1)!=EOF)
    {
        flag=0;
        memset(dp,0,sizeof(dp));
        m=strlen(str1+1);
        n=strlen(str2+1);
        for(i=1; i<=m; i++)
            for(j=1; j<=n; j++)
            {
                if(str1[i]==str2[j])
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                }
                else if(dp[i][j-1]>=dp[i-1][j])
                {
                    dp[i][j]=dp[i-1][j];
                    a[i][j]=1;
                }
                else
                {
                    dp[i][j]=dp[i-1][j];
                    a[i][j]=-1;
                }
            }

        ok(m,n);
        if(flag==0)
            printf("0");
        printf("\n");
    }
    return 0;
}

没有的情况  如 abc  def

m=3 n=3

m=3 n=2

m=3 n=1

m=3 n=0

开始向上递归 m=3 n=1由m=3 n=0推出所以没有公共子序列 

0 0
原创粉丝点击