使用动态规划的方法实现打印最长公共子序列,要求时间复杂度最小,并告知时间复杂度
时间: 2024-05-01 17:23:20 浏览: 107
动态规划实现最长公共子序列
动态规划算法可以用来解决最长公共子序列问题。算法的时间复杂度为 $O(mn)$,其中 $m$ 和 $n$ 分别为两个字符串的长度。
具体实现步骤如下:
1. 定义一个二维数组 $dp$,其中 $dp[i][j]$ 表示第一个字符串前 $i$ 个字符和第二个字符串前 $j$ 个字符的最长公共子序列的长度。
2. 初始化 $dp$ 数组,将所有元素设为 $0$。
3. 遍历两个字符串的所有字符,如果两个字符相等,则 $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]$ 开始,根据 $dp$ 数组的值逆推出最长公共子序列。
具体实现的代码如下:
```python
def print_LCS(s1, s2):
m, n = len(s1), len(s2)
# 初始化 dp 数组
dp = [[0] * (n+1) for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
# 逆推出最长公共子序列
lcs = ''
i, j = m, n
while i > 0 and j > 0:
if s1[i-1] == s2[j-1]:
lcs = s1[i-1] + lcs
i -= 1
j -= 1
elif dp[i-1][j] > dp[i][j-1]:
i -= 1
else:
j -= 1
return lcs
```
例如,对于字符串 s1 = 'ABCBDAB' 和 s2 = 'BDCABA',调用 print_LCS(s1, s2) 函数得到的结果为 'BCBA'。
阅读全文