我已经针对最长的公共子序列实现了该算法,我已经针对每个可能的测试用例对其进行了测试,并且可以正常工作,但是当我将其提交给课程的在线评分器时,它说在案例11中失败了没有想到任何可能破坏它的测试案例。你能帮我吗?它返回idx最长子序列。
def lcs2(a, b):
idx = 0
for i in a:
if i not in b:
a.remove(i)
if len(a) <= len(b):
for i in a:
if i in b:
idx += 1; b = b[b.index(i)+1:]
else:
for i in b:
if i in a:
idx += 1; a = a[a.index(i)+1:]
return idx
答案 0 :(得分:1)
我可以举一个例子: a = [1,2,3,4,5] b = [2,3,4,1,5]
一种正确的解决方案是动态编程
答案 1 :(得分:1)
您似乎要搜索的不是最长的公共子序列,而是这个最长的公共子序列的长度。但是,错误的假设是两个列表中的第一个列表包含此子序列的开始位置,而其索引比第二个列表更早。
提供的答案已经给出了发生这种情况的示例:
a = [1,2,3,4,5]
b = [2,3,4,1,5]
我将扩展为:
c = [3,4,2,1,5]
您将看到:
import itertools as it
rets = [lcs2(x,y) for x,y in it.permutations([a,b,c],2)]
combis = [(x,y) for x,y in it.permutations(['a','b','c'],2)]
print(*zip(rets, combis), sep='\n')
#(2, ('a', 'b'))
#(2, ('a', 'c'))
#(4, ('b', 'a'))
#(3, ('b', 'c'))
#(3, ('c', 'a'))
#(4, ('c', 'b'))
换句话说,您定义的lcs2
函数是非对称的,因此不正确。