您可以定义一个递归解决方案,该解决方案基于前一个元素和它来自的列表的其余元素,一次构建一个元素的序列。每个递归都可以交换参数顺序,以便逻辑只需要关心其中一个列表。
这可以通过携带基于迄今为止发现的最长序列的长度目标来进一步优化。
例如:
def longAltSeq(A,B,prev=None,minLen=0):
result = longAltSeq(B,A,min(B)-1) if prev is None else [] # inverted params
for i,a in enumerate(A): # Start with an item from A
if prev is not None and a<=prev: continue # increasing from previous
if 2*min(len(A)-i,len(B)+1)<minLen: break # not enough items left
seq = [a]+longAltSeq(B,A[i+1:],a,len(result)) # alternate A<->B
if len(seq)>len(result): result = seq # track longest
return result
输出:
A = [4, 1, 10, 5, 9]
B = [4, 5, 7, 14]
print(longAltSeq(A,B))
[1, 4, 5, 7, 9, 14]
解决方案从反转参数开始,因此列表的初始顺序无关紧要