如何优化我的字谜搜索功能?
Posted
技术标签:
【中文标题】如何优化我的字谜搜索功能?【英文标题】:How to optimize my anagram search function? 【发布时间】:2021-01-31 04:20:06 【问题描述】:我正在解决 HackerRank 的一个问题 - 我有一个有效的字谜搜索功能,但是,当涉及到大型输入数组/字符串时,它太慢了。
dictionary
和 query
输入都是单词列表,该函数应在 query
中查找每个单词的字谜数,并返回每个字对应的字谜计数列表。
dictionary = ["abc", "bca"]
query = ["abc", "xyz"]
# return [2, 0]
我尝试了 2 种方法来减少运行时间,但没有成功(隐藏测试允许的最大时间限制为 10 秒)-
-
一旦我知道不再有匹配项,就跳出循环
创建仅包含与搜索词长度相等的词的子词典
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时使用的@
【参考方案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
【讨论】:
这只会返回字典中包含字谜的单词列表 - 是否可以为字典中的每个单词添加多少字谜?以上是关于如何优化我的字谜搜索功能?的主要内容,如果未能解决你的问题,请参考以下文章