- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一个具有以下规则的小游戏:给定一组随机字母(例如 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 实现来生成所有可能的单词?
感谢您的帮助或指点!
最佳答案
我觉得这是一个好办法。我向问题中引用的 DAWG 实现的 ModulatedDAWGSet 添加了一个递归方法。
使用字符串前缀调用 getWords,将字符相加。我首先实现了此方法来生成 DAWG 中的所有单词,并与 ModulatedDAWGSet.getAllStrings() 的现有方法进行比较。然后我添加了跳过不包含单词的单词,不包括可能字符列表中的字符。
private ArrayList<String> allMatchingWords = new ArrayList<String>();
private ArrayList<Character> possibleCharacters;
private void getWords(ModifiableDAWGNode originNode, String prefix) {
NavigableMap<Character, ModifiableDAWGNode> transitionTreeMap = originNode.getOutgoingTransitions();
for(Map.Entry<Character, ModifiableDAWGNode> transition : transitionTreeMap.entrySet())
{
Character c = transition.getKey();
if(!possibleCharacters.contains(c))
continue;
ModifiableDAWGNode n = transition.getValue();
if(n.isAcceptNode()) //this is a word
{
allMatchingWords.add(prefix + c);
}
getWords(n, prefix + c);
}
}
public ArrayList<String> getAllMatchingWords(Character mustContain, ArrayList<Character> possibleCharacters)
{
allMatchingWords.clear();
this.mustContain = mustContain;
this.possibleCharacters = possibleCharacters;
getWords(sourceNode, "");
return allMatchingWords;
}
关于java - 寻求有关使用 DAWG 实现文字游戏的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61501783/
dawgdic 是一个很棒的 DAWG 库,但它有一个明显的缺点,因为它是静态的(不可更新)并且必须从按字母顺序排序的字符串中构建。如果构建 DAWG 的原始数据很大(几千兆字节),涉及对大量字符串进
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
DAWG 能否用于存储与每个路径相关的辅助信息,例如一个词在英语中的频率?如果是,那我该怎么做? 最佳答案 通常,您不能像在 trie 或其他数据结构中那样在 DAWG 中存储每个词的信息。这样做的原
我有一个 500k+ 的词表,我将它加载到 DAWG 中数据结构。我的应用程序适用于手机。我当然不想每次都重复所有的转换步骤来将此词表加载到 DAWG 中,因为在手机上保存词表需要大量存储空间,并且每
我想为动态字符串实现一个字符串查找数据结构,以支持高效的搜索和插入。目前,我正在使用 trie,但我想尽可能减少内存占用。 This Wikipedia article描述了一个 DAWG/DAFSA
我正在尝试实现一个具有以下规则的小游戏:给定一组随机字母(例如 10),我想找到可以由这些字母组成的所有可能的单词。我为此使用标准词典。 字母可以多次使用,但并非必须使用所有字母,只要它能生成 4 个
我需要为我的拼字游戏播放器创建一个 DAWG ( http://en.wikipedia.org/wiki/Directed_acyclic_word_graph) 结构,给定文件中的单词列表。我正在
我目前正在研究 DAWG,但我还没有找到一种构建非循环自动机的好方法。 所以基本上,我想做的是: 它基本上是一棵树,其中状态的数量减少了。我会将它与数字一起使用,但概念完全相同。 我想知道最快的方法是
我想创建一个 DAWG 结构来验证用户输入的单词。这将在 Android 应用程序中使用。我最好的选择是在应用程序外部序列化 DAWG 结构,然后在开始时加载它吗?或者是否有更好的方法来使用 DAWG
我只是构建了一个 trie对于一个词汇表,然后我发现有很多分支共享相同的结构。我想将它们组合在一起结果是 DAWG . 我将使用什么算法将 trie 转换为 DAWG? 最佳答案 将 trie 转换为
我制作了一个程序,旨在运行文本文档(莎士比亚的《李尔王》),并将字母 s 的所有实例替换为 z,将“sir”替换为“dawg”。我可以使用第一种方法,但是我无法弄清楚我的其他方法(旨在替换“先生”)的
在很长很长一段时间(20 多年)没有编程之后,我正试图重新投入其中。我的第一个真正尝试是拼字游戏/Words With Friends 求解器/作弊器(选择您的定义)。我已经构建了一个非常好的引擎,但
我正在尝试使用由 JSON 响应提供的 index.js 来填充网格。 我的 JSON 响应如下: {"id":"0-nm7ee1ue9bzjbstn9ygv6lxr","size":29,"pric
我需要能够快速检查给定的单词是否在我的字典(英语单词列表)中。我只关心检查成员资格的速度(而不是添加或删除元素),内存使用并不是真正的问题。 最初我使用的是这样的一套: words = set(x.s
我有一个关键字字典,我想在 Web 应用程序的客户端提供自动完成/建议功能。 ajax 周转引入了过多的延迟,因此最好将整个单词列表存储在客户端上。 该列表可能有数十万个单词,也可能有几百万个。我做了
有谁知道是否可以修改 Aho-Corasick 字符串匹配算法以用于 DAWG(有向无环词图)而不是 Trie? 最佳答案 Aho-Corasick 算法中的 trie 不是简单的单词 trie,而是
我是一名优秀的程序员,十分优秀!