有效地分组字谜

时间:2015-09-28 06:02:11

标签: algorithm hash hashtable grouping anagram

我正在尝试编写一个程序,将列表中的所有字谜组合在一起,并且输出必须按字母顺序排序。我已经有一个程序按字母顺序对输入进行排序,使用heapsort在O(nlog(n))时间内完成。我的程序也对字谜进行分组,但速度太慢。我相信使用散列将提供一个有效的算法,但不太确定如何实现它。有没有人建议有效的算法来完成这项任务?

例如。

输入:

eat tea tan ate nat bat

输出:

ate eat tea

bat

nat tan

2 个答案:

答案 0 :(得分:0)

看来你错了。根据我的理解,您首先按字母顺序对字符串进行排序,然后尝试将它们分组。

尝试相反的做法。首先,将字符串分组为字谜,然后对每个组进行排序。

可以通过各种方式对anagram进行分组,其中之一是:

  1. 将每个字符串排序为字谜。这意味着,每个anagram本身都是有序的。例如:eat,tea,nat将全部排序为字符串“aet”。 (请记住每个单词的原始形式以供日后使用)。
  2. 一旦每个单词都是“anagram sorted”,你可以简单地使用哈希表对所有单词进行分组,方法是使用Map<String,List<String>> - 其中key是“sorted anagram”,值是包含的列表所有原始单词。
  3. 获得此地图后,您需要对每个列表进行排序,这是此地图中的值,这是您的最终输出。

答案 1 :(得分:0)

是的,哈希是。

你可以使用以下散列技术:(假设你的字符串都没有空格,只有小写字符,如果它们有大写字母,它将被区别对待(cat和Act不是字谜))< / p>

字符的哈希值将是其ascii值的平方,即

a = 97*97, b = 98*98, etc.

在每个单词中添加字符值,这将是其哈希值。

现在,将具有相同(相等)哈希值的单词组合在一起。

PS:如果cat和Act是字谜,请在计算前将A转换为a

PPS:为了回应@ amit的评论,我将每个字符的ASCII值平方以减少冲突,但是,这不会完全没有碰撞。您可以使用第n个斐波纳契数的平方作为哈希值,然后添加它们。这进一步减少了碰撞。 因此,哈希值将类似于:

a = 98^2, b = 99^2, c = (98+99)^2, d = (b+c)^2 and so on...