【问题标题】:Finding anagaram(s) of dictionary words查找字典单词的字谜
【发布时间】:2011-02-07 08:59:01
【问题描述】:

如何获取输入单词(或字母序列)并从包含这些字母的字典中输出一个单词?

java 是否有一个我可以使用的英语词典类(单词列表),或者是否有它的开源实现?

如果需要重复执行,我该如何优化我的代码?

【问题讨论】:

  • 谷歌搜索“wordlist”,你会发现很多英文单词列表。

标签: java algorithm anagram


【解决方案1】:

将您的字典转换为anagram dictionary。在字谜词典中,单词按字母顺序按字母顺序索引。要查找某个单词的字谜,您可以对其字母进行排序并从字谜字典中查找相应的字母。

【讨论】:

    【解决方案2】:

    如果两个单词有完全相同的字母,完全相同的次数次,则称它们为字谜。

    字谜检查是对两个单词的字母进行排序并检查是否相等:

    sort_letters(word1) == sort_letters(word2)
    

    现在要查找给定字典单词的所有字谜,例如word1,我会在字典中找到上述测试适用的所有单词。为了优化搜索,我们可以只搜索相同长度的词。

    如果我们必须反复执行此操作,最好进行一些预处理。我们可以构建类似HashMap 的东西,其中我们会将string 映射到一组strings,它们是字谜。比如:

    Bad ==> Dab
    Cat ==> Act, Tac
    .....
    

    现在给定任何单词,我可以查看 hashMap 以获取其所有字谜。

    【讨论】:

      【解决方案3】:

      您可以使用来自 Sun 站点的Anagrams2 example 作为起点

      为了提高性能,您可以缓存常用/最近使用的单词的字谜。考虑为此目的使用 Wea​​kHashMap

      【讨论】:

        【解决方案4】:

        正如unicornaddict 所提到的,您可以通过排序相当容易地确定两个单词是否是字谜,但是这是低效的,特别是如果您重复这样做。

        准备好的哈希表可能是最好的解决方案,方法是在程序开始时将字典加载到其中。一个相当容易编写的散列/比较算法是

        uint HashSomeWord(string someWord)
        {
           uint hashVal = 0;
           //foreach letter in someword
           {
              //hashVal += letter.ValueAsInteger
           }
           return hashVal;
        }
        

        然后

        bool IsAnagram(string inputWord, string compareTo)
        {
            if(inputWord == null
               || compareTo == null
               || inputWord.Length != compareTo.Length
               || HashSomeWord(inputWord) != HashSomeSome(compareTo))
            {
               return false;
            }
            if(sort_letters(inputWord) == sort_letters(compareTo))
            {
                return true;
            }
        }
        

        我的 Java 很生锈,但我认为这样就可以了。

        【讨论】:

          【解决方案5】:

          从我的 POV 来看,这个分配的关键是找到一个函数 (hashFunc) 将字符串映射到数字,以便 1) 两个字谜映射到同一个数字,2) 两个非字谜映射到不同的数字数字。一旦找到函数,就可以简单地将其应用于输入,从而避免繁琐的字符串比较:

             if(hashFunc(word1) == hashFunc(word2)) -> word2 is anagram of word1     
          

          java 是否有一个我可以使用的英语词典类(单词列表),或者是否有它的开源实现?

          在 unix 系统上,您可以从 words file 开始

          如果需要重复执行,我该如何优化我的代码?

          使用预先计算的hashFunc 将字典转换为哈希表。

          【讨论】:

            猜你喜欢
            • 2012-09-10
            • 2013-09-20
            • 2011-09-19
            • 2021-10-16
            • 2011-08-30
            • 1970-01-01
            • 2015-05-06
            • 2011-05-13
            • 1970-01-01
            相关资源
            最近更新 更多