该算法可以接受任意数量的字母输入,包括重复字母,并使用每个字母仅一次,从中找出由这些字母组成的最长单词。我也希望快速找到前几个结果,对于底部(较短的结果)并不是非常关心,只要满足N就可以。例如:
STACK => stack, tacks, acts, cask, cast, cats…
我已经进行了一些搜索,找到了几种算法,我想出了一种我认为很有效的算法,但效率不如我所希望的那样高。
我有一个预先制作的查找字典,将排序后的键映射到生成该键的实际单词。
"aelpp" => ["apple", "appel", "pepla"]
我进一步根据键的长度将每个字典分成不同的部分。因此,长度为5个字母的键在一个字典中,长度为6个字母的键在另一个字典中。这些字典都在一个数组中,其中索引是在字典中找到的键的长度。
anagramArray[5] => dictionary5
dictionary5["aelpp"] => ["apple", "appel", "pepla"]
我的算法从输入单词"
lappe
"开始,对其进行排序:"lappe" => "aelpp"
现在,对于每个内容最多为5个字母的字典,我进行比较以将其提取出来。以下是伪代码:
word = input.sort
for (i = word.length; i > 0; i--)
dictionaryN = array[i]
for (key in dictionaryN)
if word matches key
add to returnArray
end
end
if returnArray count > N
break
end
end
returnArray.sort by longest word, alphabetize
这个词典里只有约17万个单词,但对于12个字母的输入,搜索需要长达20秒。我的match
方法会将关键字转换为正则表达式:
"ackst" => /a.*c.*k.*s.*t.*/
例如,一个四位字母密钥,如acst
(acts),将匹配ackst
(stack),因为:
"ackst" matches /a.*c.*s.*t.*/
我看到其他应用在更短的时间内完成了相同的操作,我想知道我的方法是垃圾还是只需要一些调整。
如何获得生成单词的前N个最长回文构词法的最大计算效率?