编辑代码

#include <stdio.h>
#include <string.h>
#define MAXLEN 51
 
void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN])
{
    int i, j;
    for (i = 0; i <= m; i++)
        c[i][0] = 0;
    for (j = 1; j <= n; j++)
        c[0][j] = 0;
    for (i = 1; i <= m; i++)
    {
        for (j = 1; j <= n; j++)
        {
            if (x[i - 1] == y[j - 1])
            {
                c[i][j] = c[i - 1][j - 1] + 1;
                b[i][j] = 0;//为了后面回溯,作为公共子序列的判定
            }
            else if (c[i - 1][j] >= c[i][j - 1])
            {
                c[i][j] = c[i - 1][j];
                b[i][j] = 1;//为了后面向上回溯,向上寻找子序列的判定
            }
            else
            {
                c[i][j] = c[i][j - 1];
                b[i][j] = -1;//为了后面向左回溯,向左寻找子序列的判定
            }
        }
    }
}
 
void PrintLCS(int b[][MAXLEN], char *x, int i, int j)
{
    if (i == 0 || j == 0)
        return;
    if (b[i][j] == 0)//找到了公共字符
    {
        PrintLCS(b, x, i - 1, j - 1);
        printf("%c ", x[i - 1]);
    }
    else if (b[i][j] == 1)//向上回溯的过程
        PrintLCS(b, x, i - 1, j);
    else//向左回溯的过程
        PrintLCS(b, x, i, j - 1);
}
 
int main(int argc, char **argv)
{
    char x[MAXLEN] = { "AAABDAB" };
    char y[MAXLEN] = { "BCCCBA" };
    int b[MAXLEN][MAXLEN];
    int c[MAXLEN][MAXLEN];
    int m, n;
 
    m = strlen(x);
    n = strlen(y);
 
    LCSLength(x, y, m, n, c, b);//填写动态规划表格
    PrintLCS(b, x, m, n);//回溯输出最长公共子序列
 
    return 0;
}