【发布时间】:2020-08-13 12:58:21
【问题描述】:
我正在尝试使用以下规则实现一个小游戏: 给定一组随机字母(例如 10 个),我想从这些字母中找出所有可能的单词。我为此使用了标准字典。
字母可以多次使用,并不是所有的字母都必须使用,只要是4个字符以上的单词即可。我觉得这和解字谜很像,只是字母可以被多次使用。
例如 给出的字母:q r b d t e s 可能的词:床上用品、甜点等。
在寻找支持 O(1) 以检查字典中是否存在建议单词的数据结构时,我找到了这个 paper,随后还找到了一个有效的 Java DAWG 实现 here。
这就是我卡住的地方: 当尝试生成可以从这些字母中创建的可能单词列表时,我想知道使用 DAWG 实现是否遗漏了一些东西。我在这里看到了其他线程建议使用 Trie 并递归地遍历节点,但我希望我可以用 DAWG 做类似的事情。
我目前正在使用的实现是遍历字典中的所有单词,然后跳过任何包含不属于先前分配的字母的字母的单词。这可行,但速度很慢,要遍历字典中的所有单词 * 最坏情况下约 20 个字母。
for(String word : dawg.getAllStrings()) {
boolean blacklist = false;
for(int i = 0; i<nonLetters.length(); i++) {
if(word.indexOf(nonLetters.charAt(i)) >= 0) {
blacklist = true;
break;
}
}
if(!blacklist)
possibleWordList.add(word);
}
我尝试实现递归单词匹配,但由于该实现不公开对其 Node 实现的访问权限,但我可以在本地进行更改。
如果无法访问节点,我可以使用 dawg.contains(letter),但由于需要多次使用字母,我想知道这是否真的有帮助。例如。我会从'A'开始,然后是'AA',......停在例如20 A。
使用 Trie 会更容易吗?找到匹配词仍然相当快,但更容易生成可能的词列表?
是否有其他 DAWG 库公开节点遍历或具有 ref 实现来生成所有可能的单词?
感谢任何帮助或指点!
【问题讨论】: