给出一个字符串s和一个非空字符串p,找到s中p的所有字母的开头索引。
示例:-
"cbaebabacd"
p:"abc"
[0, 6]
我已经在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
答案 0 :(得分:0)
您只需对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