【问题标题】: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 分钟。因此,需要输入我可以对代码进行哪些更改以更快地运行它。
  • 请解释变量。 ps 并不是真正有用的名称。另外,[0, 6] 是什么意思? 0 是什么? 6 是什么?
  • 当您将ik 加一时,您实际上只是在您的s4 中添加一个字符并删除一个字符。所以你不需要再次排序,这就是瓶颈。相反,我会维护一本字典。

标签: python anagram


【解决方案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]
猜你喜欢
  • 2020-11-08
  • 2020-08-20
  • 1970-01-01
  • 2014-04-13
  • 2011-08-30
  • 2021-09-14
  • 2017-12-04
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多