求两个字符串的最长公共子序列的长度. 输入:第一行字符串S1,第二行字符串 S2 (1<=字符串长度<=1000).输出:数字M,为最长公共子序列长度.测试用例如下: 输入 BDCABA ABCBDAB 输出 4 BCBA BCAB BDAB用C/C++编写代码
时间: 2024-02-17 15:04:02 浏览: 26
好的,这里是 C++ 代码实现:
```c++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int dp[N][N];
int main()
{
string s1, s2;
cin >> s1 >> s2;
int n = s1.size(), m = s2.size();
for (int i = 1; i <= n; i++)
for (int 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]);
}
cout << dp[n][m] << endl;
return 0;
}
```
这里我们同样使用一个二维数组 dp 存储最长公共子序列的长度。与 Python 实现类似,我们也采用动态规划思想来填充数组 dp。
时间复杂度为 O(nm)。
相关问题
求两个字符串的最长公共子序列的长度及输出所有最长公共子序列 C语言. 输入:第一行字符串S1,第二行字符串 S2 (1<=字符串长度<=1000).输出:数字M,为最长公共子序列长度.测试用例如下: 输入 BDCABA ABCBDAB 输出 4 BCBA BCAB BDAB
好的,让我来回答您的问题。
这个问题可以使用动态规划来解决,下面是一个 C 语言的实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000
int dp[MAX_LEN + 1][MAX_LEN + 1];
int lcs_len(char *s1, char *s2, int len1, int len2) {
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++) {
for (int 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] = (dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1];
}
}
}
return dp[len1][len2];
}
void print_all_lcs(char *s1, char *s2, int len1, int len2, char *lcs, 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(" ");
return;
}
if (s1[i - 1] == s2[j - 1]) {
lcs[lcs_len] = s1[i - 1];
print_all_lcs(s1, s2, len1, len2, lcs, lcs_len + 1, i - 1, j - 1);
} else {
if (dp[i - 1][j] >= dp[i][j - 1]) {
print_all_lcs(s1, s2, len1, len2, lcs, lcs_len, i - 1, j);
}
if (dp[i][j - 1] >= dp[i - 1][j]) {
print_all_lcs(s1, s2, len1, len2, lcs, lcs_len, i, j - 1);
}
}
}
void all_lcs(char *s1, char *s2, int len1, int len2) {
int lcslen = lcs_len(s1, s2, len1, len2);
printf("%d\n", lcslen);
char lcs[MAX_LEN];
print_all_lcs(s1, s2, len1, len2, lcs, 0, len1, len2);
}
int main() {
char s1[MAX_LEN + 1];
char s2[MAX_LEN + 1];
scanf("%s", s1);
scanf("%s", s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
all_lcs(s1, s2, len1, len2);
return 0;
}
```
这个代码可以输出任意两个字符串的最长公共子序列的长度以及所有的最长公共子序列。
用c语言解决下面问题:输入:第一行字符串S1,第二行字符串 S2 (1<=字符串长度<=1000).输出:数字M,为最长公共子序列长度.测试用例如下: 输入 BDCABA ABCBDAB 输出 4 BCBA BCAB BDAB
好的,让我来为您解答这个问题。
这个问题可以使用动态规划算法来解决,通过构建一个二维数组来记录字符串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
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)