1.完成任意两个字符串的最长公共子序列的计算,输出最长公共子序列及其长度C语言代码
时间: 2023-12-13 20:56:56 浏览: 91
以下是C语言代码实现:
```
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int max(int a, int b) {
return (a > b) ? a : b;
}
int lcs(char *str1, char *str2, int m, int n, char *result) {
// 创建动态规划表
int lcs_table[m+1][n+1];
int i, j;
for (i = 0; i <= m; i++) {
for (j = 0; j <= n; j++) {
if (i == 0 || j == 0)
lcs_table[i][j] = 0;
else if (str1[i-1] == str2[j-1])
lcs_table[i][j] = lcs_table[i-1][j-1] + 1;
else
lcs_table[i][j] = max(lcs_table[i-1][j], lcs_table[i][j-1]);
}
}
// 反向追踪lcs
i = m, j = n;
int index = lcs_table[m][n];
result[index] = '\0';
while (i > 0 && j > 0) {
if (str1[i-1] == str2[j-1]) {
result[index-1] = str1[i-1];
i--;
j--;
index--;
}
else if (lcs_table[i-1][j] > lcs_table[i][j-1])
i--;
else
j--;
}
return lcs_table[m][n];
}
int main() {
char str1[MAX_LEN], str2[MAX_LEN], result[MAX_LEN];
printf("Enter string1: ");
scanf("%s", str1);
printf("Enter string2: ");
scanf("%s", str2);
int m = strlen(str1);
int n = strlen(str2);
int lcs_len = lcs(str1, str2, m, n, result);
printf("Length of LCS: %d\n", lcs_len);
printf("LCS: %s\n", result);
return 0;
}
```
其中,`lcs`函数用于计算最长公共子序列,`max`函数用于返回两个整数中的较大值。首先创建一个大小为`(m+1) x (n+1)`的动态规划表`lcs_table`,其中`lcs_table[i][j]`表示`str1[0:i-1]`和`str2[0:j-1]`的最长公共子序列的长度。然后,通过填充表中的值,可以找到最长公共子序列的长度。最后,通过反向跟踪表,可以找到最长公共子序列本身。
阅读全文