您将获得一个字符串数组。必须只返回那些不是数组中其他字符串的子字符串的字符串。
输入-['abc','abcd','ab','def','efgd']
。
输出应该是-'abcd'
和'efgd'
我用python提出了一个时间复杂度为O(n^2)的解决方案。
有没有一种可能的解决方案可以降低时间复杂度?
我的解决方案:
def sub(l,s):
l1=l
for i in range (len(l)):
l1[i]=''.join(sorted(l1[i]))
for i in l1:
if s in i:
return True
return False
def main(l):
for i in range(len(l)):
if sub(l[0:i-1]+l[i+1:],l[i])==False:
print l[i]
main(['abc','abcd','ab','def','efgd'])
记忆有问题吗?你可以求助于久经考验的…崔!你知道吗
建立后缀树!你知道吗
根据你的意见
['abc','abcd','ab','def','efgd']
我们会有一棵树
利用对所述树的DFS(深度优先搜索)搜索,您将定位最深的叶
abcd
、efgd
和def
树遍历是非常直接的,并且您的时间复杂度是
O(n*m).
,这比您之前的O(n^2)
时间有了很大的改进。你知道吗使用这种方法,添加新的键变得很简单,但仍然很容易找到唯一的键。你知道吗
考虑添加键
deg
你的新树大概
对于这个新的树,执行DFS搜索以获得不是其他树前缀的唯一键仍然是一个简单的问题。你知道吗
请注意,上面的trie实现并没有实现DFS搜索;但是,它为您提供了一些令人惊奇的开始工作。你知道吗
弹出第一个元素。遍历剩余的每个元素,看看较短的字符串是否是较长字符串的子字符串。重复。应该是O(n logn)
编辑:实施初稿
我没有运行此代码,但应该大致正确。我不知道是否有一种不带掩码的方法,或者
[True]*len(l)
语句的时间复杂度是多少。我没有做过任何严格的分析,但在我看来这是n log n
,因为每次迭代只迭代列表的剩余部分,而不是整个列表。你知道吗使用Aho-Corasick应该允许您获得
O(n)
的渐进运行时间,代价是增加额外的内存使用,以及更高的固定成本乘数(被big-O符号忽略,但仍然有意义)。算法的复杂度是多个组件的总和,但没有一个组件相乘,因此它应该与所有度量(字符串数、字符串长度、最长字符串等)成线性关系。你知道吗使用^{} ,您将执行一个初始过程来生成一个可以同时扫描所有字符串的自动机:
注意:令人恼火的是,我现在在一台没有编译器的机器上,所以我不能安装
pyahocorasick
来测试这段代码,但我以前用过它,我相信这应该可以工作,模块化愚蠢的输入错误。你知道吗相关问题 更多 >
编程相关推荐