我如何过滤包含字符串和子字符串的列表以只返回最长的字符串。(如果列表中的任何项是另一项的子字符串,则只返回较长的字符串。)
我有这个功能。有没有更快的方法?在
def filterSublist(lst):
uniq = lst
for elem in lst:
uniq = [x for x in uniq if (x == elem) or (x not in elem)]
return uniq
lst = ["a", "abc", "b", "d", "xy", "xyz"]
print filterSublist(lst)
> ['abc', 'd', 'xyz']
> Function time: 0.000011
顺序有关系吗?如果没有
效率不高,但很简单。在
简单的二次时间解决方案如下:
但我们可以做得更好:
让
$
是一个不出现在任何字符串中的字符,其值比所有实际字符的值都要低。在让
S
是所有字符串的串联,中间是$
。在您的示例中,S = a$abc$b$d$xy$xyz
。在您可以在线性时间内生成
S
的suffix array。您还可以使用我描述的一个更简单的O(nlog^2n)构造算法in another answer。在现在,对于
lst
中的每个字符串,检查它是否只在后缀数组中出现一次。可以进行两次二进制搜索来查找子字符串的位置,它们在后缀数组中形成一个连续的范围。如果字符串出现多次,则将其删除。在通过预先计算LCP信息,这也可以在线性时间内完成。在
示例O(n log^2 n)实现,改编自my suffix array answer:
^{pr2}$然而,解释开销很可能导致这比O(n2)方法慢,除非
S
真的很大(大约10^5个字符或更多)。在您可以用矩阵形式将问题构建为:
从中可以得到
^{pr2}$out
为:然后,答案将是
lst
的索引,其中沿列的òut
的和是1
(字符串本身就是):编辑: 您可以通过以下方式更有效地完成:
相关问题 更多 >
编程相关推荐