找到字典词的anagaram

时间:2010-04-13 09:22:58

标签: java algorithm anagram

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

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

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

5 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:4)

如果两个单词的 完全相同的字母,完全相同的数字 ,则说两个单词是字谜。

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

sort_letters(word1) == sort_letters(word2)

现在找到给定字典单词的所有字谜说word1,我会找到上面测试所包含的字典中的所有单词。要优化搜索,我们只需搜索 相同长度 的字词。

如果我们必须反复这样做,最好做一些 预处理 。我们可以构建类似于HashMap的内容,我们会将string映射到一组strings,这些是字谜。类似的东西:

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

现在给出任何一个词我可以查看hashMap以获得它的所有字谜。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

正如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非常生疏,但我认为会这样做。

答案 4 :(得分:0)

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

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

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

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

开始
  

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

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