时间复杂度是多少?我只是想避免这是O(n!)。使用深度优先搜索是否会是时间复杂度O(n^2),因为对于每个字母,它可能必须通过所有其他字母最坏的情况?
我想我不确定我是否以正确的方式考虑这个问题。
当我说使用深度优先搜索时,我的意思是从第一个字母开始深度优先搜索,然后从第二个字母开始,等等。
那有必要吗?
注意:
最初的问题是在填字游戏/拼图板上找到所有可能的单词。我正在考虑使用 trie 数据结构来查找字典中是否有单词,但我正在考虑自己生成单词的方法。
时间复杂度是多少?我只是想避免这是O(n!)。使用深度优先搜索是否会是时间复杂度O(n^2),因为对于每个字母,它可能必须通过所有其他字母最坏的情况?
我想我不确定我是否以正确的方式考虑这个问题。
当我说使用深度优先搜索时,我的意思是从第一个字母开始深度优先搜索,然后从第二个字母开始,等等。
那有必要吗?
注意:
最初的问题是在填字游戏/拼图板上找到所有可能的单词。我正在考虑使用 trie 数据结构来查找字典中是否有单词,但我正在考虑自己生成单词的方法。
根据上面的讨论,这是我的答案:
定义:atrieX
是一个子树,只有长度的单词X
。
由于我们有一个包含所需语言的所有单词的 trie,我们也可以获得适当的trieX
.
我们说填字游戏有w
单词,所以我们创建一个 long 数组w
,其中每个条目是 trieX 的根,其中X
是相关单词的长度。这为我们提供了每个空白单词中可能出现的单词列表。
然后迭代单词之间的交集并消除无法放置的单词。当没有更多更改完成时 - 我们停止。
两点意见:
1. 为了提高性能,我们从添加长词或非常短的词开始。什么是短或长?看看这个和这个。
2. 从 trieX 中删除词也可以通过检查词之间的依赖关系来完成(如果 THIS 词在这里,那么 THAT 词不能在那里,等等)。这更复杂,所以如果有人想添加一些关于如何轻松做到这一点的想法 - 请这样做。