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