最长公共子序列(LCS) c语言/c++

只显示结果(动规递推):

#include<stdio.h>
#include<string.h>
#include <iostream>
#define N 105

using namespace std;

int dp[N+1][N+1];
char str1[N],str2[N];

int maxx(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
int LCSL(int len1,int len2)
{
    int i,j;
    int len=maxx(len1,len2);
    for(i=0; i<=len; i++)
    {
        dp[i][0]=0;
        dp[0][i]=0;
    }
    for(i=1; i<=len1; i++)
        for(j=1; j<=len2; j++)
        {
            if(str1[i-1]==str2[j-1])
            {
                dp[i][j]=dp[i-1][j-1]+1;
            }
            else
            {
                dp[i][j]=maxx(dp[i-1][j],dp[i][j-1]);
            }
        }
    return dp[len1][len2];
}
int main()
{
    while(cin>>str1>>str2)
    {
        int len1=strlen(str1);
        int len2=strlen(str2);
        printf("%d\n", LCSL(len1,len2));
    }
    return 0;
}

显示路径及结果:

#include<stdio.h>
#include<string.h>
#include <iostream>

using namespace std;

char a[100];
char b[100];
char c[100][100],d[100][100];
char e[100];
int m=0;

void f(int i,int j)
{
    if(i==0 || j==0)
        return;
    else if(d[i][j]==0)
    {
        f(i-1,j-1);
        e[m]=a[i];
        m++;
    }
    else if(d[i][j]==1)
        f(i-1,j);
    else
        f(i,j-1);
}

int main()
{
    int i;
    gets(a);
    gets(b);
    int s1=strlen(a),s2=strlen(b);
    for(i=s1+1; i>0; i--)
        a[i]=a[i-1];
    for(i=s2+1; i>0; i--)
        b[i]=b[i-1];
    for(i=0; i<=s1; i++)
        c[i][0]=0;
    for(i=1; i<=s2; i++)
        c[0][i]=0;
    for(i=1; i<=s1; i++)
        for(int j=1; j<=s2; j++)
        {
            if(a[i]==b[j])
            {
                c[i][j]=c[i-1][j-1]+1;
                d[i][j]=0;
            }
            else if(c[i-1][j]>=c[i][j-1])
            {
                c[i][j]=c[i-1][j];
                d[i][j]=1;
            }
            else
            {
                c[i][j]=c[i][j-1];
                d[i][j]=-1;
            }
        }
    f(s1+1,s2+1);
    e[m]='\0';
    printf("公共子序列:%s\n长度:%d\n", e,strlen(e));
    return 0;
}



猜你喜欢

转载自blog.csdn.net/wxz1814/article/details/78304368