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

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 分钟。因此,需要输入我可以对代码进行哪些更改以更快地运行它。 请解释变量。 ps 并不是真正有用的名称。另外,[0, 6] 是什么意思? 0 是什么? 6 是什么? 当您将ik 加一时,您实际上只是在您的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]

以上是关于查找字符串中的所有字谜如何优化的主要内容,如果未能解决你的问题,请参考以下文章

如何优化我的字谜搜索功能?

Python:字谜查找器

使用python中的递归解决方案在字符串列表中查找字谜

代码高尔夫:查找所有字谜

在给定的字符串列表中查找字符串的所有字谜

将字符串与字符串列表进行比较以在 Python 中查找字谜