查找字典单词的字谜

Posted

技术标签:

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

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

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

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

【问题讨论】:

谷歌搜索“wordlist”,你会发现很多英文单词列表。 【参考方案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 将字典转换为哈希表。

【讨论】:

以上是关于查找字典单词的字谜的主要内容,如果未能解决你的问题,请参考以下文章

查找最长字谜的算法

字谜查找程序 php mysql

查找单词字谜数量的算法?

从单词列表中查找给定句子的字谜

查找给定单词的字谜

在文件中查找给定单词的字谜