【问题标题】:How to optimize my anagram search function?如何优化我的字谜搜索功能?
【发布时间】:2021-01-31 04:20:06
【问题描述】:

我正在解决 HackerRank 的一个问题 - 我有一个有效的字谜搜索功能,但是,当涉及到大型输入数组/字符串时,它太慢了。

dictionaryquery 输入都是单词列表,该函数应在 query 中查找每个单词的字谜数,并返回每个字对应的字谜计数列表。

dictionary = ["abc", "bca"]
query = ["abc", "xyz"]

# return [2, 0]

我尝试了 2 种方法来减少运行时间,但没有成功(隐藏测试允许的最大时间限制为 10 秒)-

  1. 一旦我知道不再有匹配项,就跳出循环
  2. 创建仅包含与搜索词长度相等的词的子词典
def stringAnagram(dictionary, query):
    result = []
    for i in range(len(dictionary)):
            dictionary[i] = "".join(sorted(dictionary[i]))
    dictionary.sort()
    dictionary.sort(key=len)
    
    for word in query:
        i = 0
        sortedWord = "".join(sorted(word))
        subDictionary = [entry for entry in dictionary if len(entry) == len(sortedWord)]
        
        for entry in subDictionary:
            if sortedWord == entry:
                i += 1
        result.append(i)
        
    return result

谁能指出瓶颈在哪里?

【问题讨论】:

  • 你从来没有明确地说明stringAnagram应该做什么,一些示例输入和输出会有所帮助。
  • 在未来,codereview.stackexchange.com 会更适合这个,因为你的代码已经可以工作了。当然,您需要重新格式化问题以匹配该网站的规则。
  • @CoryKramer 对不起,我忘了补充,我现在添加了解释和示例
  • collections.Counter 是你的朋友。这就是我写stromberg.dnsalias.org/~strombrg/anagrams时使用的@

标签: python optimization anagram


【解决方案1】:

不是创建特定长度的字符串的排列并比较它以查看是否有任何匹配,而是有一个简单的观察,即如果它们是字谜,则两个字符串中任何字符的数量将相同。

【讨论】:

    【解决方案2】:
    def stringAnagram(dictionary, query):
        sorted_dictionary = {''.join(sorted(word)) for word in words}
        result = [word for word in query if ''.join(sorted(word)) in sorted_dictionary]
        return result
    

    【讨论】:

    • 这只会返回字典中包含字谜的单词列表 - 是否可以为字典中的每个单词添加多少字谜?
    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多