你有一个单词词典和两个字符串 a
和 b
.
如何通过一次只更改一个字符并确保所有中间单词都在字典中来将a转换为b?
例:
dictionary: {"cat", "bat", "hat", "bad", "had"}
a = "bat"
b = "had"
解:
"bat" -> "bad" -> "had"
编辑:下面给出的解决方案建议从字典单词构建图形,使得每个单词将具有仅由一个字符区别的所有其他单词的边缘 . 如果字典太大,这可能有点困难(让我们说我们不是只讨论英语单词) .
此外,即使这是可以接受的,创建这样的图形的最佳算法是什么?查找从单词到所有其他单词的边缘将是O(n),其中n是字典大小 . 总图形结构是O(n2)?有更好的算法吗?
这不是作业问题,而是面试问题 .
4 回答
这是直的
O(nm)
其中
n
是字典中的单词数,m
是输入单词中的字符数算法很简单,如果字典中的单词与1个字符的输入不匹配,则认为它是一个解决方案:
您可以将此视为图搜索问题 . 每个单词都是图中的一个节点,如果两个单词之间只有一个字母,则它们之间有一条边 . 在此图表上运行BFS将找到起始单词和目标单词之间的最短路径(如果可以将一个单词转换为另一个单词),并且将报告无法执行此操作 .
简单地在图表上做一个BFS,其节点是单词,如果节点上的单词相差一个字母,则两个节点之间有一条边 . 通过这种方式,您可以通过从给定的起始单词启动BFS来提供解决方案 . 如果到达目标节点,则可能,否则不可能 .
您还可以提供所采取的步骤,并注意您将提供最少数量的步骤来获得所需的奖励 .
P.S:巧合的是,在一次采访中我也问过这个问题,我编写了这个解决方案!
预先构建并重新使用旅行 Map . 例如,使用有效的单词距离构建scity [] [],可以重复使用 .
只是一个快速锻炼的工作,可能会简化 .