LeetCode126—Word Ladder II

这篇博客详细解析LeetCode126—Word Ladder II的问题,探讨如何找到从beginWord到endWord的所有最短转换序列。博主介绍了使用BFS寻找前驱节点,然后用DFS回溯找出所有路径的策略,并讨论了时间优化和空间优化的细节,包括在BFS中处理节点访问和避免内存超出限制的方法。
摘要由CSDN通过智能技术生成

LeetCode126—Word Ladder II

据说是全LeetCode通过率最低的题,确实非常难,但从算法层面讲还不至于到想不到写不了的地步,只是说很多细节需要注意,我在提交过程中遇到的两个主要问题是:超时(Time Limit Exceed)和超出内存限制(Memory Limit Exceed)

1.原题

Given two words (beginWord and endWord), and a dictionary’s word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:

Only one letter can be changed at a time
Each intermediate word must exist in the word list
For example,

Given:
beginWord = “hit”
endWord = “cog”
wordList = [“hot”,”dot”,”dog”,”lot”,”log”]
Return
[
[“hit”,”hot”,”dot”,”dog”,”cog”],
[“hit”,”hot”,”lot”,”log”,”cog”]
]


2.分析

LeetCode127—Word Ladder的意思一样,隐式的图论的题目,这题相对更难,原因是需要求出所有的路径,而前者只需要求出路径长度即可(事实上这可以从数据结构设计上忽略不少细节,在这题中就体现的淋漓尽致)。这样我们就很快有了一个比较清晰的思路,首先:

  1. 首先,为了得出所有路径(可能有多条,并且可能多条通过同一个节点),其中一个节点可能被访问多次,我们想到了dfs,因为在递归的返回的过程中包含了回溯。
  2. 如果对beginWord、endWord以及wordList中的所有单词建立一个图的话,当数据量上去的时候,这个图将非常之大(主要体现在边的规模有可能非常大)
  3. 考虑到在Word Ladder中求路径的方法,我们可以建立一个部分信息的图——即仅仅保留BFS遍历过程中某些节点的前驱节点。这样我们就可以得到一个“有向图”(这里并不是真正的有向图,只是形式上很像),这个“有向图”可以以邻接表的方式来体现,就好像迪杰斯特拉一样知道每个节点的前驱节点最终递归得到整条路径。

总结一下,这个题的思路就是:
BFS -> 求出每个节点的前驱节点
DFS -> 从后往前搜索出路径


3.细节

这里有两个细节,一个是时间优化,一个是空间优化。

时间优化

首先所有的参数都用引用肯定是必要的,单个变量就罢了,对于这种有容器的还是用引用比较高效。

BFS在遍历的时候按层进行遍历的,由于我们这里要找出所有有用的前驱节点,所以在BFS的时候要做一些手脚:
那就是每一层结束之后,再对visit属性进行调整,但因此,这里就会出现问题,看下图:

这里写图片描述

BFS访问完节点0后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值