C++最长公共子序列问题代码
时间: 2023-11-24 10:00:50 浏览: 34
以下是一个求解最长公共子序列问题的 C 语言代码示例:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 100
int max(int a, int b) {
return (a > b) ? a : b;
}
int lcs(char* str1, char* str2, int len1, int len2) {
int dp[MAX_LENGTH][MAX_LENGTH];
for (int i = 0; i <= len1; i++) {
for (int 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_LENGTH], str2[MAX_LENGTH];
scanf("%s %s", str1, str2);
int len1 = strlen(str1);
int len2 = strlen(str2);
int result = lcs(str1, str2, len1, len2);
printf("The length of longest common subsequence is %d\n", result);
return 0;
}
```
这个程序中,函数 `lcs` 用于计算两个字符串的最长公共子序列。使用动态规划的思想,通过建立一个二维数组 `dp` 来保存中间结果。数组中的每个元素 `dp[i][j]` 表示字符串 `str1` 的前 `i` 个字符和字符串 `str2` 的前 `j` 个字符的最长公共子序列长度。如果 `str1[i-1] == str2[j-1]`,则当前字符在两个字符串中都存在,可以将最长公共子序列长度加一,否则将当前字符从其中一个字符串中去掉,取两种情况中的较大值作为最长公共子序列的长度。最终返回 `dp[len1][len2]`,即两个字符串的最长公共子序列长度。
注意事项:
- 本程序中的最长公共子序列要求不需要连续,如果需要连续,则需要改变动态规划的状态转移方程。
- 在输入字符串时,要保证字符串的长度不超过 `MAX_LENGTH`,否则可能会导致数组越界。
- 在实际应用中,为了避免字符串的长度过大,需要对算法进行优化,比如使用滚动数组等技巧。