h0099. 最长公共子序列
时间: 2024-04-14 11:25:06 浏览: 127
h0099是一个算法题目,题目要求找出两个字符串的最长公共子序列(Longest Common Subsequence,简称LCS)。最长公共子序列是指在两个字符串中都出现的、且相对顺序保持一致的字符序列。
解决这个问题的常见方法是使用动态规划。具体步骤如下:
1. 创建一个二维数组dp,其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符的最长公共子序列的长度。
2. 初始化dp数组的第一行和第一列为0,表示空字符串与任意字符串的最长公共子序列长度为0。
3. 遍历字符串s1和s2的每个字符,如果当前字符相等,则dp[i][j] = dp[i-1][j-1] + 1;否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1]),表示当前字符不在最长公共子序列中。
4. 最终dp[m][n]即为字符串s1和s2的最长公共子序列的长度,其中m和n分别为字符串s1和s2的长度。
相关问题
最长公共子序列 输出所有最长公共子序列 C语言
好的,让我来回答您的问题。
最长公共子序列问题是一个经典的计算机科学问题,它的解决方案有很多种。其中一种常用的方法是动态规划。
下面是一个 C 语言实现最长公共子序列问题并输出所有最长公共子序列的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int dp[MAX_LEN][MAX_LEN];
void print_all_lcs(char str1[MAX_LEN], char str2[MAX_LEN], char lcs[MAX_LEN], 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("\n");
return;
}
if (str1[i - 1] == str2[j - 1]) {
lcs[lcs_len] = str1[i - 1];
print_all_lcs(str1, str2, lcs, lcs_len + 1, i - 1, j - 1);
} else {
if (dp[i - 1][j] >= dp[i][j - 1]) {
print_all_lcs(str1, str2, lcs, lcs_len, i - 1, j);
}
if (dp[i][j - 1] >= dp[i - 1][j]) {
print_all_lcs(str1, str2, lcs, lcs_len, i, j - 1);
}
}
}
void lcs(char *str1, char *str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (str1[i - 1] == str2[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];
}
}
}
char lcs[MAX_LEN];
print_all_lcs(str1, str2, lcs, 0, len1, len2);
}
int main() {
char str1[MAX_LEN];
char str2[MAX_LEN];
scanf("%s%s", str1, str2);
lcs(str1, str2);
return 0;
}
```
这个代码可以输出任意两个字符串的最长公共子序列以及所有的最长公共子序列。
递归算法求解最长公共子序列,并输出最长公共子序列
非常抱歉,之前提供的代码存在错误。以下是修复后的递归算法,用于求解最长公共子序列并输出结果:
```c
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
void printLCS(char *str1, char *str2, int m, int n, int dp[m+1][n+1]) {
if (m == 0 || n == 0) {
return;
}
if (str1[m - 1] == str2[n - 1]) {
printLCS(str1, str2, m - 1, n - 1, dp);
printf("%c", str1[m - 1]);
}
else if (dp[m-1][n] > dp[m][n-1]) {
printLCS(str1, str2, m - 1, n, dp);
}
else {
printLCS(str1, str2, m, n - 1, dp);
}
}
int LCS(char *str1, char *str2, int m, int n) {
if (m == 0 || n == 0) {
return 0;
}
if (str1[m - 1] == str2[n - 1]) {
return 1 + LCS(str1, str2, m - 1, n - 1);
}
else {
return max(LCS(str1, str2, m - 1, n), LCS(str1, str2, m, n - 1));
}
}
int main() {
char str1[] = "AGGTAB";
char str2[] = "GXTXAYB";
int m = strlen(str1);
int n = strlen(str2);
int dp[m+1][n+1];
int lcsLength = LCS(str1, str2, m, n);
printf("Longest Common Subsequence Length: %d\n", lcsLength);
printLCS(str1, str2, m, n, dp);
return 0;
}
```
请尝试运行修复后的代码,它将通过递归算法求解最长公共子序列,并输出结果。
阅读全文