编辑代码

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

int lcs(char* s1, char* s2, int n1, int n2) {
    int dp[n1+1][n2+1];
    memset(dp, 0, sizeof(dp));

    for (int i = 1; i <= n1; i++) {
        for (int j = 1; j <= n2; j++) {
            if (s1[i-1] == s2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            } else {
                dp[i][j] = (dp[i-1][j] > dp[i][j-1]) ? dp[i-1][j] : dp[i][j-1];
            }
        }
    }

    // 回溯查找最长公共字符串子序列
    int i = n1, j = n2;
    char lcs[dp[n1][n2]+1];
    int k = dp[n1][n2];
    while (i > 0 && j > 0) {
        if (s1[i-1] == s2[j-1]) {
            lcs[k--] = s1[i-1];
            i--;
            j--;
        } else if (dp[i-1][j] > dp[i][j-1]) {
            i--;
        } else {
            j--;
        }
    }
    lcs[dp[n1][n2]] = '\0';

    printf("最长公共字符串子序列为:%s\n", lcs);

    return dp[n1][n2];
}

int main() {
    char s1[] = "ABCDGH";
    char s2[] = "AGGTAB";
    int n1 = strlen(s1);
    int n2 = strlen(s2);

    int len = lcs(s1, s2, n1, n2);
    printf("最长公共字符串子序列的长度为:%d\n", len);

    return 0;
}