2.(动态规划方法求解最长公共子序列问题)求两个序列X=(a,b,c,b,d,b),Y=(a,c,b,b,a,b,d,b,b)的最长公共子序列问题并输出子序列;Python代码
时间: 2023-07-28 09:47:31 浏览: 90
以下是Python实现最长公共子序列问题的代码,并输出最长公共子序列:
```python
def lcs(X, Y):
m = len(X)
n = len(Y)
c = [[0] * (n+1) for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if X[i-1] == Y[j-1]:
c[i][j] = c[i-1][j-1] + 1
else:
c[i][j] = max(c[i-1][j], c[i][j-1])
# 根据c数组反向查找最长公共子序列
lcs = []
i, j = m, n
while i > 0 and j > 0:
if X[i-1] == Y[j-1]:
lcs.append(X[i-1])
i -= 1
j -= 1
elif c[i-1][j] > c[i][j-1]:
i -= 1
else:
j -= 1
lcs.reverse()
return c[m][n], lcs
X = ['a', 'b', 'c', 'b', 'd', 'b']
Y = ['a', 'c', 'b', 'b', 'a', 'b', 'd', 'b', 'b']
length, lcs = lcs(X, Y)
print("最长公共子序列长度为:", length)
print("最长公共子序列为:", lcs)
```
在上述代码中,增加了反向查找最长公共子序列的代码。在计算完成c[m][n]后,从c[m][n]开始,根据c数组反向查找最长公共子序列,将每个匹配的字符加入到lcs数组中。最终返回lcs数组即为序列X和序列Y的最长公共子序列。
阅读全文