【问题标题】:Group together all the anagrams [closed]将所有字谜组合在一起[关闭]
【发布时间】:2011-04-08 06:05:49
【问题描述】:

问题陈述: 给定一组 k 个字符串,每个长度为 n。您必须一起输出这组字谜。字谜就像例如 atm - mat , like-kile。

【问题讨论】:

  • 您的问题是……或者您的网名是否表明您希望如何得到回答? :)
  • 顺便说一句,作业或面试问题?如果你标记得当,你总是可以让其他人更容易在表单 内容中提供最相关的帮助!-)

标签: algorithm anagram


【解决方案1】:

只需对单词的字母进行排序即可获得特定于字谜的签名。例如,在 Python 中,

sig = ''.join(sorted(word))

并创建一个dict,其中sig 作为键,值是具有该签名的单词列表(defaultdict(list) 非常适用于此)。当然,您可以使用任何具有排序能力的语言,以及其值可以是列表或向量的关联数组;-)。

【讨论】:

  • 在 C# 中:myStrings.ToLookup(str => new string(str.OrderBy(c => c).ToArray()));
  • @Alex :使用所有这些排序技术将占用更多的空间和时间复杂度。有什么优雅的解决方案,不需要对它们进行排序,然后将每个与其他所有匹配。???
  • @Silver Spoon:我相信 Alex 的解决方案具有时间复杂性 O(k * n * log(n))。这已经很不错了。我不相信你可以理论上做得更好O(k * n),即使要接近它,你也必须添加更多假设。
  • @Silver,在我的方法中绝对没有“将每个与所有其他匹配” - 这就是dict(或hashmap或其他关联数组数据结构),将单词签名映射到具有该签名的单词列表,这就是全部。 如果你有一个 good 散列函数(从单词到单词签名)独立于单词中的字母顺序,并且以某种方式保证(a)永远不会映射两个同一签名 的非字谜(为了性能)(b)不会产生“太多”的意外哈希巧合(不是微不足道的!-),您当然可以跳过按字母排序步骤。
  • @Ani,我认为唯一需要的“额外假设”是关于拥有那个“梦想哈希函数”的假设(但我认为这是一个大问题,因为我不知道这样一个函数 没有严重违反我之前评论中的 a 和 b 点;-)。由于单词通常很短,因此“按字母排序”步骤确实很便宜!-)
猜你喜欢
  • 1970-01-01
  • 2015-01-28
  • 2012-04-26
  • 2020-01-28
  • 1970-01-01
  • 2020-12-18
  • 2013-11-25
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多