【发布时间】:2015-11-11 07:23:25
【问题描述】:
注意:这个问题与 Python 无关。我这里只是用它来代替伪代码。
给定一个数组A 包含平均长度为M 的N 字符串,我想创建一个新数组B,它只包含A 中不是子字符串(或相同)的字符串复制)A 中的任何其他字符串。这是一个例子:
A = [ 'foo', 'bar', 'foobar', 'foobar' ]
B = [ 'foobar' ]
我正在寻找在时间复杂度方面最有效的方法。天真的方法看起来像这样
B = []
for i in range(0, len(A)):
noSubstring = True
for j in range(i + 1, len(A)):
if A[i] in A[j]:
noSubstring = False
break
if noSubstring:
B.append(A[i])
时间复杂度为O(N^2 * M^2)。有什么办法可以加快速度吗?
我一直在考虑使用专用数据结构来有效地编码和重用字符串序列。例如,如果我想删除只是数组中另一个字符串的前缀的字符串,我可以创建一个 trie / 前缀树 (O(N*M)),然后收集所有叶元素(另一个 O(N*M))。然而,到目前为止,我未能使这种方法适应更普遍的子字符串问题。
【问题讨论】:
-
您可能想使用
set代替A,因为无论如何您都不想重复。 -
在你的 naiva 实现中,如果 A[i] 比 A[j] 长,你可以避免进行字符串搜索
标签: python algorithm performance substring