假设您有一个单词,例如'cook',并且您希望通过将所有其他字母替换为每个字母来生成可以从该单词生成的所有可能单词的图表。一个重要的限制:如果一个字母集合是一个单词,你可以询问字典,但这是你的字典界面的限制。你不能只是在字典中询问所有的n个字母的单词。
我认为这将是一个生成DAG的递归算法,如下所示:
cook
/ | \
aook ... zook
/ | \ / | \
aaok ... azok zaok ... zzok
等等。显然,实际上许多这些排列都会被拒绝,因为它们不是真正的单词,但最终你会得到一个包含可以生成的所有“单词”的DAG。图形的高度将是输入字的长度加1.
在最坏的情况下,每个排列都是一个单词。第一级有1个单词,第二级有25个,下一个级别(25 * 25)等等。因此,如果n是单词的长度,我认为这意味着算法的最坏情况时间复杂度为25 ^ n,最差情况下的存储复杂度为25 ^ n?
答案 0 :(得分:0)
最好不要将其视为树,而是将其视为图形。
让n
为输入,即单词的长度。
让W
成为长度为$ n $的所有(有意义的)单词。
构建一个简单的图G
,如下所示:G
的顶点为W
;当且仅当它们因一个字符而不同时,两个单词w1
和w2
才会连接它们。
然后您要做的是以下内容:
在
w
中找到W
字样,在图w
中找到G
的关联组件。
这通常使用depth-first search(DFS)或breadth-first search(BFS)完成。你的算法是一种BFS(但不太正确:每次你应该生成一个单词的所有邻居,而不仅仅是那些替换了一个地方的邻居)。
由于我们可能假设$ n $很小,因此时间复杂度在理论上与结果的大小呈线性关系(尽管有一个非常大的大O常数)
但是,你也应该有一个相同大小的内存,记住已经检查过哪个单词。
答案 1 :(得分:0)
如果只生成可以在字典中找到的单词,那么时间复杂度受字典大小的限制,因此它应该是O(min(|D|, 25^n))
。