实验五:最长公共子序列(LCS)
1.时间复杂度O(mn),空间复杂度O(mn),求出LCS 及其长度。
int m = text1.size(), n = text2.size();
// 初始化dp数组,dp[i][j] 表示text1前i个字符和text2前j个字符的最长公共子序列长度
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 构建动态规划表
for (int i = 1; i <= m; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (text1[i - 1] == text2[j - 1])
{
// 如果第text1第i位的字符和第text2第j位的字符一样,则dp[i][j]就用前i-1,j-1位的最长子序列长度+1
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else
{
// 否则,就用去掉第i位字符的最长子序列长度,或者去掉第j位最长子序列长度
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// 回溯构造LCS
string lcs = "";
int i = m, j = n;
while (i > 0 && j > 0)
{
if (text1[i - 1] == text2[j - 1]) // 说明该字符属于最长公共子序列
{
lcs = text1[i - 1] + lcs;
--i;
--j;
}
else if (dp[i - 1][j] > dp[i][j - 1]) // 说明text1第i位不在公共子序列中
{
--i;
}
else // 说明text2第j位不在公共子序列中
{
--j;
}
}
2.时间复杂度O(mn),空间复杂度O(2*min(m,n)),求出LCS 的长度。
使用滚动数组
3.时间复杂度O(mn),空间复杂度O(min(m,n)),求出LCS 的长度。
使用tmp代替滚动数组存储上一行的数据(每次只需要用到一个数据)
816

被折叠的 条评论
为什么被折叠?



