用c语言求两个字符串的最长公共子序列的长度. 输入:第一行字符串S1,第二行字符串 S2 (1<=字符串长度<=1000).输出:数字M,为最长公共子序列长度.测试用例如下: 输入 BDCABA ABCBDAB 输出 4 BCBA BCAB BDAB
时间: 2024-02-18 21:59:25 浏览: 62
以下是用C语言实现求两个字符串的最长公共子序列的长度的代码:
```
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1001
int max(int a, int b) {
return (a > b) ? a : b;
}
int lcs(char *str1, char *str2, int len1, int len2) {
int i, j;
int dp[MAX_LEN][MAX_LEN];
for (i = 0; i <= len1; i++) {
for (j = 0; j <= len2; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
} else if (str1[i-1] == str2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[len1][len2];
}
int main() {
char str1[MAX_LEN], str2[MAX_LEN];
int len1, len2;
scanf("%s%s", str1, str2);
len1 = strlen(str1);
len2 = strlen(str2);
printf("%d\n", lcs(str1, str2, len1, len2));
return 0;
}
```
我们首先定义一个`max`函数,用于比较两个数的大小,然后定义一个`lcs`函数,用于计算最长公共子序列的长度。在`lcs`函数中,我们使用一个二维数组`dp`来记录字符串的最长公共子序列的长度。初始化时,将`dp[0][j]`和`dp[i][0]`均设为0。然后,我们使用两个循环遍历两个字符串,如果字符串中的字符相同,就将`dp[i][j]`的值设为`dp[i-1][j-1]+1`;否则,就将`dp[i][j]`的值设为`max(dp[i-1][j], dp[i][j-1])`。最后,返回`dp[len1][len2]`的值,即为两个字符串的最长公共子序列的长度。
在`main`函数中,我们首先读入两个字符串,然后使用`strlen`函数计算字符串的长度,最后调用`lcs`函数来计算最长公共子序列的长度,并将结果输出。
阅读全文