最长公共子序列

来源:互联网 发布:淘宝运费险可以赔多少 编辑:程序博客网 时间:2024/04/28 01:53
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXSIZE 100//最长公共子序列int LCS(const char *a, const char *b, char *result);int main(void){    char *a = "ABCBDAB";    char *b = "BDCABA";    char result[MAXSIZE];    printf("%d\n", LCS(a, b, result));    printf("%s\n", result);    return 0;}int LCS(const char *a, const char *b, char *result){    int i;    int j;    int count;    int d[MAXSIZE][MAXSIZE];    int lengthA = strlen(a);    int lengthB = strlen(b);    //初始化第0列    for (i = 0; i <= lengthA; ++i)    {        d[i][0] = 0;    }    //初始化第0行    for (i = 0; i <= lengthB; ++i)    {        d[0][i] = 0;    }    for (i = 1; i <= lengthA; ++i)    {        for (j = 1; j <= lengthB; ++j)        {            //如果相等            if (a[i - 1] == b[j - 1])            {                d[i][j] = d[i - 1][j - 1] + 1;            }            //d[i][j - 1]较大            else if (d[i - 1][j] <= d[i][j - 1])            {                d[i][j] = d[i][j - 1];            }            //d[i - 1][j]较大            else            {                d[i][j] = d[i - 1][j];            }        }    }    //长度    count = d[lengthA][lengthB];    result[count] = '\0';    i = lengthA;    j = lengthB;    while (i != 0 && j != 0)    {        if (a[i - 1] == b[j - 1])        {            result[--count] = a[i - 1];            --i;            --j;        }        else if (d[i][j - 1] <= d[i - 1][j])        {            --i;        }        else        {            --j;        }    }    return d[lengthA][lengthB];}

原创粉丝点击