【发布时间】:2021-11-04 15:10:06
【问题描述】:
我正在尝试使用以下代码打印所有可能的最长公共子序列
1-首先我找到了 LCS 长度 dp 矩阵并尝试使用递归来产生所有可能的输出。
################################################Print ALL LCS ################################333
class Solution:
def LcsHelper(self,text1,text2,dp,output,m,n):
if m<0 or n<0:
return output
if text1[m]==text2[n]:
out=[]
for elem in output.copy():
out.append(text1[m]+elem)
#output.remove(elem) # Remove this line show every possiblities
return self.LcsHelper(text1,text2,dp,out,m-1,n-1)
elif dp[m-1][n]>dp[m][n-1]:
return self.LcsHelper(text1,text2,dp,output,m-1,n)
elif dp[m-1][n]<dp[m][n-1]:
return self.LcsHelper(text1,text2,dp,output,m,n-1)
else:
out1=self.LcsHelper(text1,text2,dp,output,m-1,n)
out2=self.LcsHelper(text1,text2,dp,output,m,n-1)
return out1+out2
def printlongestCommonSubsequence(self, text1,text2):
m, n = len(text1), len(text2)
dp = [[0]*(n+1) for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if text1[i-1] == text2[j-1]:
dp[i][j] = dp[i-1][j-1]+1
else:
dp[i][j] = max(dp[i][j-1], dp[i-1][j])
return self.LcsHelper(text1,text2,dp,[""],m-1,n-1)
输入和输出
s=Solution()
text1="BDCABA"
text2="ABCBDAB"
s.printlongestCommonSubsequence(text1,text2)
-----output--------------
['BDAB',
'AB',
'BAB',
'AB',
'BCAB',
'CAB',
'A',
'BA',
'A',
'BCA',
'CA',
'BCA',
'CA',
'BCBA',
'CBA']
目前,我正在获得所有可能性以及一些虚拟可能性。实际上,每次我将字符添加到输出列表时,我都需要弹出字符并将其插入为旧的附加新的。但是当我添加行时
output.remove(elem)
然后它只显示了 LCS 的一种可能性,而不是全部。请帮忙,我哪里出错了?
['BDAB']
【问题讨论】:
-
添加更多细节,例如输入和输出
-
@Sabil 包括在内。
-
不应该是BDAB、BCAB、BCBA吗?
-
@Sabil ,是的,应该。但我只需要列表中的 3 项,您还可以在那里看到其他一些以前的数据。
标签: python recursion dynamic-programming recursive-backtracking longest-substring