如何从包含这些字母的字典中输入输入字(或字母序列)并输出单词?
java是否有我可以使用的英语词典类(单词列表),或者是否有开源实现?
如果需要反复进行,我该如何优化我的代码?
答案 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
将字典转换为哈希表。