编辑代码

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

#define Len 100

// 动态规划数组
int table[Len + 1][Len + 1];

// 计算两个字符串的最长公共子序列
void find(char str1[], char str2[]) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);

    // 初始化动态规划数组
    for (int i = 0; i <= len1; i++) {
        for (int j = 0; j <= len2; j++) {
            if (i == 0 || j == 0)
                table[i][j] = 0;
            else if (str1[i - 1] == str2[j - 1])
                table[i][j] = table[i - 1][j - 1] + 1;
            else
                table[i][j] = (table[i - 1][j] > table[i][j - 1]) ? table[i - 1][j] : table[i][j - 1];
        }
    }

    // 输出最长公共子序列的长度
    printf("长度: %d\n", table[len1][len2]);

    // 输出最长公共子序列
    int index = table[len1][len2];
    char lcs[index + 1];
    lcs[index] = '\0'; // 结尾字符
    int i = len1, j = len2;
    while (i > 0 && j > 0) {
        if (str1[i - 1] == str2[j - 1]) {
            lcs[index - 1] = str1[i - 1];
            i--;
            j--;
            index--;
        } else if (table[i - 1][j] > table[i][j - 1]) {
            i--;
        } else {
            j--;
        }
    }

    // 输出最长公共子序列
    printf("子序列: %s\n", lcs);
}

int main() {
    char str1[] = "ABCBDAB";
    char str2[] = "BDCAB";
    find(str1, str2);

    char str3[] = "AB";
    find(str1, str3);
    
    char str4[] = "ABB";
    find(str1, str4);
    return 0;
}