最长公共子序列 输出所有子序列 C语言
时间: 2023-09-14 21:09:21 浏览: 63
好的,让我来回答您的问题。
首先,最长公共子序列问题是一个经典的计算机科学问题,它的解决方案有很多种。其中一种常用的方法是动态规划。
下面是一个简单的 C 语言实现最长公共子序列问题的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
void print_all_lcs(int dp[MAX_LEN][MAX_LEN], char str1[MAX_LEN], char str2[MAX_LEN], int len1, int len2, char lcs[MAX_LEN], 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("\n");
return;
}
if (str1[i - 1] == str2[j - 1]) {
lcs[lcs_len] = str1[i - 1];
print_all_lcs(dp, str1, str2, len1, len2, lcs, lcs_len + 1, i - 1, j - 1);
} else {
if (dp[i - 1][j] >= dp[i][j - 1]) {
print_all_lcs(dp, str1, str2, len1, len2, lcs, lcs_len, i - 1, j);
}
if (dp[i][j - 1] >= dp[i - 1][j]) {
print_all_lcs(dp, str1, str2, len1, len2, lcs, lcs_len, i, j - 1);
}
}
}
void lcs(char *str1, char *str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int dp[MAX_LEN][MAX_LEN];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (str1[i - 1] == str2[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];
}
}
}
char lcs[MAX_LEN];
print_all_lcs(dp, str1, str2, len1, len2, lcs, 0, len1, len2);
}
int main() {
char str1[MAX_LEN];
char str2[MAX_LEN];
scanf("%s%s", str1, str2);
lcs(str1, str2);
return 0;
}
```
这个代码可以输出任意两个字符串的最长公共子序列以及所有的子序列。
阅读全文