1. 实验内容
本实验实现了计算两个字符串之间的 最长公共子序列(LCS) 的算法,并进行了不同空间复杂度优化版本的实现。要求:
-
编写程序实现最长公共子序列(LCS)算法,并理解其核心思想。
-
实现三种空间复杂度优化版本:
-
时间复杂度:O(mn),空间复杂度:O(mn),计算LCS及其长度。
-
时间复杂度:O(mn),空间复杂度:O(2 * min(m, n)),计算LCS长度。
-
时间复杂度:O(mn),空间复杂度:O(min(m, n)),计算LCS长度。
-
给定两个字符串 text1
和 text2
,求出它们的最长公共子序列(LCS)及其长度。
2. 算法设计思路
2.1 动态规划
最长公共子序列问题可以通过 动态规划(DP)来解决。基本思路是定义一个二维数组 dp
,其中 dp[i][j]
表示 text1[0...i-1]
和 text2[0...j-1]
的最长公共子序列的长度。我们通过逐步构建这个数组,最终得到 dp[m][n]
,其中 m
和 n
分别是 text1
和 text2
的长度。
状态转移方程:
-
如果
text1[i-1] == text2[j-1]
,则dp[i][j] = dp[i-1][j-1] + 1
。 -
否则,
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
。
2.2 空间优化
为了优化空间复杂度,可以通过以下方式进行优化:
-
优化1:使用二维
dp
数组存储当前行和上一行的状态,空间复杂度为 O(mn)。 -
优化2:由于只需要利用上一行的数据,使用滚动数组的方