【发布时间】: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中添加一个字符并删除一个字符。所以你不需要再次排序,这就是瓶颈。相反,我会维护一本字典。