Python 最长公共子序列(恢复序列)
我有2个序列,需要找到最长的公共子序列。无法理解为什么我的功能还原不起作用Python 最长公共子序列(恢复序列),python,lcs,Python,Lcs,我有2个序列,需要找到最长的公共子序列。无法理解为什么我的功能还原不起作用 #sequenses A=[1,2,3] B=[2,3,1,5] #table AxB rows=[0]*(len(B)+1) table=[rows for l in range(len(A)+1)] for i in range(len(A)): for k in range(len(B)): if A[i]==B[k]: table[i+1][k+1]=table[i
#sequenses
A=[1,2,3]
B=[2,3,1,5]
#table AxB
rows=[0]*(len(B)+1)
table=[rows for l in range(len(A)+1)]
for i in range(len(A)):
for k in range(len(B)):
if A[i]==B[k]:
table[i+1][k+1]=table[i][k]+1
else:
table[i+1][k+1]=max(table[i][k+1], table[i+1][k])
print(table)
lst=[]#subsequence
#function to restore subsequence by walking through table
def restore(s1,s2):#s1=len(A)-1, s2=len(B)-1
if s1==-1 or s2==-1:
pass
elif A[s1]==B[s2]:
print (1)
lst.append(A[s1])
restore(s1-1, s2-1)
else:
if table[s1][s2+1]==table[s1+1][s2+1]:
restore(s1-1,s2)
else:
restore(s1, s2-1)
return lst
如果我这样做
print (restore(2,3))
函数返回
[]
我认为,这个问题存在于索引中,但无法找到它所在的位置。这是您的第一个问题:
rows=[0]*(len(B)+1)
table=[rows for l in range(len(A)+1)]
Python使用列表引用。因此,当您创建一组行
时,实际上是对同一行
列表的多个引用。看看这个测试代码:
>>> rows = [0]*5
>>> table = [rows for l in range(5)]
>>> table
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> table[0][2] = 4
>>> table
[[0, 0, 4, 0, 0], [0, 0, 4, 0, 0], [0, 0, 4, 0, 0], [0, 0, 4, 0, 0], [0, 0, 4, 0, 0]]
看看这个变化是如何重复的?这是因为我对同一个列表有5个引用,而不是5个列表。试试这个:
table = [None]*(len(A)+1)
for i in range(len(table)):
table[i] = [0]*(len(B)+1)