c语言求求两个字符串的最长公共子序列的长度. 输入:第一行字符串S1,第二行字符串 S2 (1<=字符串长度<=1000).输出:数字M,为最长公共子序列长度.测试用例如下: 输入 BDCABA ABCBDAB 输出 4 BCBA BCAB BDAB
时间: 2024-02-18 07:59:44 浏览: 60
好的,这是一个经典的动态规划问题,可以使用动态规划算法来解决。以下是C语言的代码实现:
```
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
char s1[1001], s2[1001];
int dp[1001][1001];
int len1, len2;
int i, j;
fgets(s1, 1001, stdin);
fgets(s2, 1001, stdin);
len1 = strlen(s1) - 1;
len2 = strlen(s2) - 1;
memset(dp, 0, sizeof(dp));
for (i = 1; i <= len1; i++) {
for (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] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
printf("%d\n", dp[len1][len2]);
return 0;
}
```
具体思路:
定义一个二维数组 `dp[i][j]`,表示字符串 `s1` 前 `i` 个字符和字符串 `s2` 前 `j` 个字符的最长公共子序列长度。
当 `s1[i-1]` 等于 `s2[j-1]` 时,说明这两个字符可以构成公共子序列的一部分,所以此时的最长公共子序列长度应该是 `dp[i-1][j-1] + 1`。
当 `s1[i-1]` 不等于 `s2[j-1]` 时,说明这两个字符不能构成公共子序列的一部分,所以此时的最长公共子序列长度应该是 `dp[i-1][j]` 和 `dp[i][j-1]` 中的较大值。
最终的答案就是 `dp[len1][len2]`,其中 `len1` 和 `len2` 分别是两个字符串的长度。
阅读全文