查找字典单词的字谜
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 作为起点
为了提高性能,您可以缓存常用/最近使用的单词的字谜。考虑为此目的使用 WeakHashMap
【讨论】:
【参考方案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
将字典转换为哈希表。
【讨论】:
以上是关于查找字典单词的字谜的主要内容,如果未能解决你的问题,请参考以下文章