求两个字符串的最长公共子序列的长度及输出所有最长公共子序列 C语言. 输入:第一行字符串S1,第二行字符串 S2 (1<=字符串长度<=1000).输出:数字M,为最长公共子序列长度.测试用例如下: 输入 BDCABA ABCBDAB 输出 4 BCBA BCAB BDAB
时间: 2023-12-13 15:09:22 浏览: 128
好的,让我来回答您的问题。
这个问题可以使用动态规划来解决,下面是一个 C 语言的实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000
int dp[MAX_LEN + 1][MAX_LEN + 1];
int lcs_len(char *s1, char *s2, int len1, int len2) {
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; 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];
}
}
}
return dp[len1][len2];
}
void print_all_lcs(char *s1, char *s2, int len1, int len2, char *lcs, int lcs_len, int i, int j) {
if (i == 0 || j == 0) {
for (int k = lcs_len - 1; k >= 0; k--) {
printf("%c", lcs[k]);
}
printf(" ");
return;
}
if (s1[i - 1] == s2[j - 1]) {
lcs[lcs_len] = s1[i - 1];
print_all_lcs(s1, s2, len1, len2, lcs, lcs_len + 1, i - 1, j - 1);
} else {
if (dp[i - 1][j] >= dp[i][j - 1]) {
print_all_lcs(s1, s2, len1, len2, lcs, lcs_len, i - 1, j);
}
if (dp[i][j - 1] >= dp[i - 1][j]) {
print_all_lcs(s1, s2, len1, len2, lcs, lcs_len, i, j - 1);
}
}
}
void all_lcs(char *s1, char *s2, int len1, int len2) {
int lcslen = lcs_len(s1, s2, len1, len2);
printf("%d\n", lcslen);
char lcs[MAX_LEN];
print_all_lcs(s1, s2, len1, len2, lcs, 0, len1, len2);
}
int main() {
char s1[MAX_LEN + 1];
char s2[MAX_LEN + 1];
scanf("%s", s1);
scanf("%s", s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
all_lcs(s1, s2, len1, len2);
return 0;
}
```
这个代码可以输出任意两个字符串的最长公共子序列的长度以及所有的最长公共子序列。
阅读全文