📅  最后修改于: 2023-12-03 15:26:28.301000             🧑  作者: Mango
最长公共子序列(Longest Common Subsequence)是指两个或多个字符串序列中最长的子序列,这个子序列不需要在原字符串中连续出现。求解最长公共子序列可以采用动态规划算法,时间复杂度为O(N^2)。
以下是C++实现最长公共子序列的程序:
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;
int dp[MAXN][MAXN];
int main() {
string str1, str2;
getline(cin, str1); // 读入字符串1
getline(cin, str2); // 读入字符串2
int len1 = str1.length();
int len2 = str2.length();
memset(dp, 0, sizeof(dp)); // 初始化dp数组
// 边界初始化
for (int i = 0; i <= len1; i++) {
dp[i][0] = 0;
}
for (int i = 0; i <= len2; i++) {
dp[0][i] = 0;
}
// 动态规划
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] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// 输出结果
cout << "最长公共子序列长度为:" << dp[len1][len2] << endl;
return 0;
}
最长公共子序列的求解可以采用动态规划算法,定义dp[i][j]为序列str1(0~i)和序列str2(0~j)的最长公共子序列长度,那么dp[i][j]有以下两种情况:
str1[i] == str2[j],此时dp[i][j] = dp[i-1][j-1] + 1。
str1[i] != str2[j],此时dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
最后,dp[len1][len2]即表示序列str1和序列str2的最长公共子序列长度。
由于输入的是带空格的字符串,所以采用getline()函数读入。
初始化dp数组为0。
边界条件初始化:dp[i][0]和dp[0][j]都为0,表示一个字符串为空时,最长公共子序列长度为0。
动态规划:当字符串str1[i-1]等于字符串str2[j-1]时,dp[i][j] = dp[i-1][j-1]+1,否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
输出最长公共子序列长度。