最长公共子序列

来源:互联网 发布:sql trigger insert 编辑:程序博客网 时间:2024/05/21 06:46
#include "stdio.h"#include "stdlib.h"#include "math.h"#include "string.h"#define N 100int lcsLength(char *x, char *y, int lenx, int leny, int z[N][N], int b[N][N])//返回字符串a和b的最长公共子串长度//lenx为字符串x的长度,leny为子串y的长度//z[i][j]记录字符串a[i]、b[j]最长公共子串长度//b[i][j]记录c[i][j]的值是由哪个子问题得到(3种情况之一),构造最长公共子序列时用到{    int i, j;    for(i=1; i<=leny; i++)        z[0][i] = 0;  //当子串a为空时,最长公共子串长度为0    for(i=1; i<=lenx; i++)        z[i][0] = 0;  //当子串b为空时,最长公共子串长度为0    for(i=1; i<=lenx; i++)  //自下而上计算子问题        for(j=1; j<=leny; j++)        {            if(x[i] == y[j])  //情况1            {                z[i][j] = z[i-1][j-1] + 1;                b[i][j] = 1;            }            else if(z[i-1][j] >= z[i][j-1])  //情况2            {                z[i][j] = z[i-1][j];                b[i][j] = 2;            }            else  //情况3            {                z[i][j] = z[i][j-1];                b[i][j] = 3;            }        }    return z[lenx][leny];}void lcs(int i, int j, char x[N], int b[N][N]) //构造公共子序列{    if(i==0 || j==0) return;    /*第1种情况下,X(i)和Y(j)的最长公共子序列由X(i-1)和          Y(j-1)的解LCS(i-1, j-1, x, b),加上位于最后的X[i]组成    */    else if(b[i][j]==1)     {        lcs(i-1,j-1,x,b);        printf("%c", x[i]);    }    //其它2种情况下,原问题等于子问题解    else if(b[i][j]==2)        lcs(i-1,j,x,b);    else        lcs(i,j-1,x,b);}int main(){    char x[N], y[N];    gets(x);    gets(y);    int lenx = strlen(x);    int leny = strlen(y);    int i;    for(i=lenx; i>0; i--)        x[i] = x[i-1];    for(i=leny; i>0; i--)        y[i] = y[i-1];    int z[N][N], b[N][N];    int length = lcsLength(x, y, lenx, leny, z, b);    printf("最长公共长度为:%d\n", length);    lcs(lenx, leny, x, b);    printf("\n");    return 0;}
0 0
原创粉丝点击