使用动态规划算法求两个序列的最长公共子序列,需构造一条最长公共子序列。 输入 每组输入包括两行,每行包括一个字符串。 输出 两个字符序列的一条最长公共子序列。(输入已确保最长公共子序列的唯一性)
时间: 2024-05-07 20:19:20 浏览: 37
以下是使用动态规划算法求解两个序列的最长公共子序列的 Python 代码:
```python
def lcs(s1, s2):
m, n = len(s1), len(s2)
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])
i, j = m, n
lcs_str = ""
while i > 0 and j > 0:
if s1[i - 1] == s2[j - 1]:
lcs_str = s1[i - 1] + lcs_str
i -= 1
j -= 1
elif dp[i - 1][j] > dp[i][j - 1]:
i -= 1
else:
j -= 1
return lcs_str
```
其中 `s1` 和 `s2` 分别表示两个字符串,函数返回它们的最长公共子序列。在动态规划的过程中,我们使用一个二维数组 `dp` 来记录子问题的最优解,其中 `dp[i][j]` 表示 `s1` 的前 `i` 个字符和 `s2` 的前 `j` 个字符的最长公共子序列长度。在计算 `dp[i][j]` 的过程中,如果 `s1[i-1]` 和 `s2[j-1]` 相等,则 `dp[i][j]` 等于 `dp[i-1][j-1] + 1`,否则 `dp[i][j]` 等于 `max(dp[i-1][j], dp[i][j-1])`。最后,我们可以根据 `dp` 数组和两个字符串构造出最长公共子序列。具体地,从 `dp[m][n]` 开始,如果 `s1[i-1]` 和 `s2[j-1]` 相等,则将这个字符加入到最长公共子序列中,并向左上角移动;如果 `dp[i-1][j]` 大于 `dp[i][j-1]`,则向上移动;否则向左移动。重复这个过程直到 `i` 或 `j` 等于 0。最终返回的 `lcs_str` 就是最长公共子序列。
阅读全文