最长的公共子序列测试用例失败

时间:2019-01-07 09:08:31

标签: python algorithm

我已经针对最长的公共子序列实现了该算法,我已经针对每个可能的测试用例对其进行了测试,并且可以正常工作,但是当我将其提交给课程的在线评分器时,它说在案例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

2 个答案:

答案 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函数是非对称的,因此不正确。