查找字符串中的所有字谜如何优化
Posted
技术标签:
【中文标题】查找字符串中的所有字谜如何优化【英文标题】:Find all anagram in a string how to optimize 【发布时间】:2019-05-16 03:04:14 【问题描述】:给定一个字符串 s 和一个非空字符串 p,在 s 中找到 p 的字谜的所有起始索引。
例子:-
输入:s:"cbaebabacd"
p:"abc"
输出:[0, 6]
说明:
起始索引 = 0 的子串是“cba”,它是“abc”的变位词。
起始索引 = 6 的子字符串是“bac”,它是“abc”的变位词。
我用 Python 编写了这段代码,用于“查找字符串中的所有字谜”
当我运行这段代码时,它会给我消息Time exceeded
:
1)我的逻辑是否正确
2) 我如何优化以便它可以运行得更快,因为对于大输入字符串需要很长时间(大约 1 分钟)。
def anagram(s,p):
if len(p)>len(s):
return False
l_s=len(s)
l_p=len(p)
list1=[]
offset=l_p
k=offset
i=0
while (i <= l_s):
s4=s[i:k]
#print ("s= "+s4)
if sorted(p)==sorted(s4):
list1.append(i)
i+=1
k=i+(offset)
return list1
【问题讨论】:
p
应该做什么?关于你的变量是什么以及你想要输出什么的一些解释会很好。
您是否运行了分析器来查看热点在哪里?
我已经在上面的评论部分提到了关于输入和输出的代码,例如“查找字符串中的所有字谜”。输入:s:“cbaebabacd” p:“abc” 输出:[0, 6]。我的程序也以正确的输出运行。对于长度 > 10000 的较大输入字符串,仅需要 > 1 分钟。因此,需要输入我可以对代码进行哪些更改以更快地运行它。
请解释变量。 p
和 s
并不是真正有用的名称。另外,[0, 6]
是什么意思? 0
是什么? 6
是什么?
当您将i
和k
加一时,您实际上只是在您的s4
中添加一个字符并删除一个字符。所以你不需要再次排序,这就是瓶颈。相反,我会维护一本字典。
【参考方案1】:
您只需对p
排序一次,因为它永远不会改变。您可以在函数的开头执行此操作。
当您到达i = len_s - len_p
时应该停止循环,因为字符串的其余部分比p
短。
def anagram(s,p):
if len(p)>len(s):
return False
len_p = len(p)
sorted_p = sorted(p)
list1=[]
for i in range(len(s) - len_p + 1):
s4=s[i:i+len_p]
#print ("s= "+s4)
if sorted_p == sorted(s4):
list1.append(i)
return list1
【讨论】:
感谢 Barmar 的快速回复。当我运行您的程序时,输入 (s="abab",p="ab") 的结果不正确,为 [0, 1]。它应该是 [0, 1, 2]。我的程序运行良好,唯一的问题是它很慢。 Fencepost 错误,我过早停止了 1 个字符。 谢谢巴马尔。现在可以了。好逻辑。但从时间上看,我仍然认为这需要大约一分钟。所以运行时间没有改善。当我给 s=1000 (即“aaaa .........1000 个 a”)和 p=1000 (即“aaaa .........1000 个 a”)时,就会发生这种情况 s 和 p 都是 1000 个字符?那应该只循环一次,所以它相当于if sorted(p) == sorted(s):
对不起,“s”比我说的要多。输入如下:- s 中 a 的数量=(aaa....... ............20002 a's)和 p =(aaa............10001 a's)。这个答案是 [0, 10001]以上是关于查找字符串中的所有字谜如何优化的主要内容,如果未能解决你的问题,请参考以下文章