是否有更有效的算法来查找作为给定语言的一部分的所有子串,而不是以下字符串:
import string.ascii_lowercase as alphabet
languge = {'aa', 'bc', 'wxyz', 'uz'};
for i in xrange(len(alphabet)):
for j in xrange(i,len(alphabet)):
substirng = alphabet[i:j+1]
if substirng in languge:
print substirng
答案 0 :(得分:2)
如果我理解你的问题。你有一个字母或字符串。在这种情况下,一个26个字符的字符串,a-z。您希望检查提供给您的任何字符串是否是上述"字符串字符串"的子字符串。
如果确实如此,那就有更好的方法。
您当前的方法相当于计算字母表中所有可能的子字符串,在您的特定情况下,在大小为N和26 ^ 2的字母表的一般情况下为O(N ^ 2),然后检查子字符串是否属于您的预定义集。一个更好的方法是简单地遍历给定的字符串和check if they are substrings of your alphabet。这是预定义集中每个字符串的O(N)操作。这使复杂性降低到O(NM)。
如果M明显小于N,则效果会更好。
可能有更好的方法,但这是一个良好的开端。
答案 1 :(得分:1)
如果你使用它会更好
而是from string import ascii_lowercase as alphabet
language = {'aa', 'bc', 'wxyz', 'uz'}
for item in language:
if item in alphabet:
print item
这有效,但列表理解是首选
substrings = [item for item in language if item in alphabet]
答案 2 :(得分:1)
使用用于此目的的Aho-Corasick或Rabin-Karp算法:
这是一种定位元素的字典匹配算法 输入文本中的一组有限字符串(“字典”)。它 同时匹配所有字符串
这些算法有很多Python实现。
Aho-Corasick搜索的复杂度为O(TextLength + AnswerLength)
,预处理O(n *σ),其中n是字典中所有单词的总长度,σ是字母大小
对于Rabin-Karp平均时间也是O(TextLength + AnswerLength)
,但最糟糕的时间是O(TextLength * AnswerLength)