【发布时间】:2017-04-16 09:11:36
【问题描述】:
我试图从字典中找到两个给定单词之间的最短阶梯。包括给定单词和字典中的所有单词都具有相同数量的字符。在一次通过中,只能更改一个字符,并且需要最短路径。例如:给定:“hit”和“cil” Dic:[“hil”,“hol”,“hot”,“lot”,“lit”,“lil”] 所以,答案应该是“hit”-> “希尔”->“希尔”
我尝试使用 BFS 解决这个问题;通过在字典中查找下一个单词并检查它是否与队列中弹出的项目相邻。这种方法不会给我最短的路径:
如果,我尝试用 26 个字母替换每个字母,并且如果结果单词出现在字典中,请接受:仍然这种方法不会给我最短路径。例如:在这里,它应该给我:hit->lit->lot->hot->hol->lil->cil
可能更好的方法是先构造一棵树,然后在树中找到从起始词到结束词的最短路径。
我知道,这个论坛上有这个问题的解决方案,但没有一个解释算法。我是 BFS 的新手,所以不太熟悉。 我有兴趣知道如何找到最短路径之一,如果有几条则所有最短路径。
【问题讨论】:
-
听起来很像旅行推销员问题,我无法想象除了蛮力之外还有其他解决方案,如果你找到了一个不错的算法,请回答你自己的问题
-
你读过Levenshtein距离吗?
-
字典有多大?字典里有多少个词?
-
“可能更好的方法是先构造一棵树,然后在树中找到从起始词到结束词的最短路径。”... 像 trie 这样的东西是更好的数据结构对于字典,但不适用于这个问题,因为 trie 非常依赖于字母序列。第 0 个字符不同的单词会比第 n 个字符不同的单词更远。
-
BFS 或 A-Star(以 Levenshtein 距离作为启发式)应该可以工作。您的实现中确实存在错误(一旦发现就不要停止,没有将节点标记为正确访问,...)。