【问题标题】:Grouping anagrams [duplicate]分组字谜[重复]
【发布时间】:2013-07-29 20:50:06
【问题描述】:

给定单词数组,对字谜进行分组 IP:{焦油,老鼠,香蕉,atr} OP:{[tar,rat,atr],[香蕉]}

使用哈希表解决这个问题的一个方法。考虑每个单词,对其进行排序,如果不存在,则将其作为键添加到哈希表中。键的值将是具有相同键的所有字谜的列表。我想知道时间复杂度,要对数组中的字符进行排序,假设 O(n log n) 存储在哈希表中将是 O(n),总共 O(n*nlogn)。

有没有更好的算法?时间复杂度更低?

【问题讨论】:

  • 但是n 是单词的长度,而不是数组中的单词数,所以应该不会太糟糕。无论如何,您可以定义自己的哈希函数,该函数将独立于重新排列。例如,将字母值相加:tar -> 20+1+18=39。但这可能不是一个很好的哈希值。
  • 看不出这个问题和dup的关系。请参阅here 以获取与顺序无关的哈希。我编写的测试应用程序转储了哈希值和单词,然后我通过哈希对其进行排序以将字谜组合在一起,这似乎是您前进的方向。

标签: algorithm sorting anagram


【解决方案1】:

出于时间复杂性的考虑,您始终可以使用计数排序来对单个单词进行排序,这仅花费每个单词的线性时间。您也可以先计算字母的出现次数,然后对出现次数进行哈希处理,而不是对已排序的单词进行哈希处理,这与计算排序减去重建步骤基本相同。

但由于单词通常很短,这可能不会给您带来任何实际优势。

【讨论】:

  • +1。就大 O 表示法而言,计算字母频率然后对其进行散列的解决方案肯定比 O(N* M * lg(M)) 更好,其中 M 是最长字符串的长度。因为根据您的解决方案,它有 O(26*NM) = O(NM)。但我同意你的观点,它不会带来任何实际优势(即使 N 和 M 很小,它的性能也可能比 OP 现在做的差):)
  • 嗯,这是一个面试问题,我已经编写了我在问题中描述的答案。但我不太清楚采访。所以想知道是否存在更好的东西。
  • 面试的因素太多了,比如你写的程序有多好?你分析得好吗?你是一个很好的文化匹配吗?但是从算法上讲,你给出的答案应该足够了。
  • 好吧,我有一个小错误,在他要求审查我的代码后我结束了纠正。从字面上踢自己。很确定其他一切都很好。
猜你喜欢
  • 2015-12-25
  • 2013-09-09
  • 2012-11-22
  • 2016-05-21
  • 2012-10-11
  • 2013-05-20
  • 2020-05-11
  • 2012-01-01
  • 2012-03-27
相关资源
最近更新 更多