查找字符串中的所有字谜如何优化

时间:2018-12-14 20:34:14

标签: python anagram

给出一个字符串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

1 个答案:

答案 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