【问题标题】:Anagram Algorithm using a hashtable and/or tries使用哈希表和/或尝试的 Anagram 算法
【发布时间】:2013-11-05 04:44:22
【问题描述】:

我已经在互联网上搜索了一段时间,寻找使用哈希表和 trie 查找字符串(单词)的所有字谜(即团队产生单词 tame)的步骤。我在这里找到的只是验证 2 个单词是字谜。我想更进一步,找到一个英文算法,以便我可以用 Java 对其进行编程。

例如,

  • 遍历所有字符。
  • 为每个唯一字符插入哈希表。
  • 等等。

我不想要一个完整的程序。是的,我正在练习面试。如果出现这个问题,我会知道并知道如何解释它,而不仅仅是记住它。

【问题讨论】:

  • @user2864740 抱歉。我不清楚。我刚刚编辑了我的示例。 Team 一词产生了一个名为 Tame 的词。
  • @atomman - 这是一个非常好的链接。然而,根据一些面试官的说法,递归的开销如此之高,以至于有些人正在寻找使用哈希表或 Tries 的实现。
  • @JigarJoshi,我们花了 forever 摆脱了interview-questions,请不要重新引入它。

标签: java algorithm anagram


【解决方案1】:

“编程珍珠”一书中引用的某个人的最简洁的答案是(释义):

“这样排序(水平挥手从左到右),然后那样排序(垂直挥手从上到下)”

这意味着,从一个单列表 (word) 开始,创建一个两列表:(sorted_word, word),然后在第一列对其进行排序。

现在要查找单词的变位词,首先计算排序的单词并对其在表的第一列中的第一次出现进行二进制搜索,并在第一列相同时读取第二列的值。

输入(不需要排序):

mate
tame
mote
team
tome

按“这种方式”排序(水平):

aemt, mate
aemt, tame
emot, mote
aemt, team
emot, tome

按“那种方式”排序(垂直):

aemt, mate
aemt, tame
aemt, team
emot, mote
emot, tome

查找“团队”->“aemt”

aemt, mate
aemt, tame
aemt, team

就哈希表/尝试而言,只有在您想要稍微更快的查找时,它们才会出现。使用哈希表,您可以根据第一列的哈希将 2 列垂直排序的表划分为 k 个分区。这将为您提供恒定的加速因子,因为您只需在一个分区内进行二进制搜索。通过帮助您避免进行过多的字符串比较,尝试是一种不同的优化方式,您可以为 trie 中的每个终端的表的适当部分挂起第一行的索引。

【讨论】:

  • 感谢您的解释,但我不明白您是如何从输入部分到排序的“这种方式”部分的?您是如何通过算法找到第二列的?我的问题是使用单词中的字母找到我能找到的所有有效单词:Team。
  • @Allen elephant -> aeehlnpt, xerox -> eorxx, thanks -> ahknst, for -> for, the -> eht, explanation -> aaeilnnoptx .. 明白了吗?
【解决方案2】:

哈希表不是最好的解决方案,所以我怀疑你会被要求使用它们。

查找字谜对的最简单方法(据我所知)如下:

映射字符如下:

a -> 2 b -> 3 c -> 5 d -> 7

以此类推,字母 a..z 映射到前 26 个素数。

将单词中每个字符的字符值相乘,我们称之为“字谜编号”。很容易看出 TEAM 和 TAME 会产生相同的数字。事实上,当且仅当它们是字谜时,两个不同单词的字谜值才会相同。

因此,在两个列表之间查找字谜的问题简化为查找出现在两个列表上的字谜值。这很容易通过按字谜编号对每个列表进行排序并逐步查找常用值来完成,时间为 nlog(n) 次。

【讨论】:

    【解决方案3】:
    • Stringchar[]
    • 排序char[]
    • 从已排序的char[] 生成String
    • 将其用作HashMap<String, List<String>> 的密钥
    • 将当前原始字符串插入到关联值列表中

    例如对于

    car, acr, rca, abc 会有的

    acr: car, acr, rca
    abc: abc
    

    【讨论】:

    • 这是我一直在寻找的,但我不清楚你的步骤。例如,使用单词 Team 和您的步骤: 1. 'T' 'E' 'A' 'M' 2. 'A' 'E' 'M' 'T' 3. AEMT 4. 只有 1 个项目在地图中,AEMT
    • 对不起,我在完成输入之前按了输入。例如,使用单词 Team 和你的步骤: 1) 'T' 'E' 'A' 'M' 2) 'A' 'E' 'M' 'T' 3) "AEMT" 4. 只有地图中的 1 项,AEMT Bullet 4:您的字符串列表中有什么?根据您的步骤,地图似乎只包含 1 项,其键为“AEMT”
    • 根据我的步骤会有{AEMT: {TEAM,AEMT}}
    猜你喜欢
    • 2012-06-03
    • 2016-06-23
    • 1970-01-01
    • 2018-05-20
    • 2012-11-27
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多