用c语言解决下面问题:输入:第一行字符串S1,第二行字符串 S2 (1<=字符串长度<=1000).输出:数字M,为最长公共子序列长度.测试用例如下: 输入 BDCABA ABCBDAB 输出 4 BCBA BCAB BDAB
时间: 2024-02-18 10:59:38 浏览: 70
函数:字符串s1中删除串s2里包含的所有字符(c语言)
5星 · 资源好评率100%
好的,让我来为您解答这个问题。
这个问题可以使用动态规划算法来解决,通过构建一个二维数组来记录字符串S1和S2的公共子序列的长度。具体做法如下:
1. 定义一个二维数组dp,其中dp[i][j]表示S1的前i个字符和S2的前j个字符的最长公共子序列的长度。
2. 初始化dp数组,当i=0或j=0时,dp[i][j]的值为0。
3. 遍历S1和S2的每个字符,如果S1的第i个字符等于S2的第j个字符,则dp[i][j]等于dp[i-1][j-1]+1,否则dp[i][j]等于dp[i-1][j]和dp[i][j-1]中的较大值。
4. 最终dp[n][m]即为S1和S2的最长公共子序列的长度,其中n和m分别为S1和S2的长度。
下面是C语言的代码实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000
int dp[MAX_LEN+1][MAX_LEN+1];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
char s1[MAX_LEN+1], s2[MAX_LEN+1];
int n, m, i, j;
scanf("%s%s", s1, s2);
n = strlen(s1);
m = strlen(s2);
// 初始化dp数组
for (i = 0; i <= n; i++) {
dp[i][0] = 0;
}
for (j = 0; j <= m; j++) {
dp[0][j] = 0;
}
// 计算dp数组
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; 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[n][m]);
return 0;
}
```
输入样例:
```
BDCABA
ABCBDAB
```
输出样例:
```
4
```
阅读全文