LeetCode刷题-126. 单词接龙 II
题目链接:126. 单词接龙 II
¶题解:
是一道难题,DFS和BFS的结合使用!
¶题目简述:
给定两个不一样的单词和一个字典,找到所有从一个单词到另一个单词的序列!
单词的变化每次转换只能改变一个字母,字典中不一定存在起始单词!
¶题解:
这道题本质是一道求最短路的问题:即从起始单词到结束单词的最短路,并且边权为一,可以使用BFS
来求最短路!
这道题不仅仅要求最短路的长度,而是要记录出所有最短路的路径,这里需要使用DFS
来搜索路径!
关于建图方法: 假设单词数为n
,单词长度为L
- 枚举所有单词,判断两两单词(n^2)是否只有一位不同(L),为
n^2L
- 枚举每个单词,每个单词的每一位(26nL)判断是否只有一位不同,哈希表优化判断存在或使用过,为
26nL^2
简单计算: 当26L < n
时,使用第二种,否则使用第一种,本题的数据为n > 26L
,所以要使用第二种,否则超时
进入正题!!!本题思路:
DFS + BFS:
- 使用
BFS
来求一个dist
数组,表示当前点到起始点的最短路径长度- 使用第二种建图方式,即要枚举每一位的二十六种变化即可,若该点在字典中并且没有被遍历过,即
S.count(t) && dist.count(t) == 0
,我们就进行遍历dist[t] = dist[s] + 1
,正常宽搜顺序,将当前点加入队列即可! - 若搜到了终点,直接
break
,跳到上一层循环,防止搜索不必要的路径
- 使用第二种建图方式,即要枚举每一位的二十六种变化即可,若该点在字典中并且没有被遍历过,即
- 通过
dist
数组来倒着DFS
搜索到起点的路径即可dfs(endWord)
- 对于最当前点
s
,只需要搜索可以到达改点的路径,即s
的邻接点,并且只要保证dist[s] = dist[t] + 1
即说明有一条从t
到s
的最短路径,当然我们要保证该点在字典中即dist.count(t) != 0
- 接下来继续向上搜索,直到起始单词,由于路径数组
path
是倒序存储的,所以搜到起点要将容器进行反转计入答案,完事之后再将其恢复
- 对于最当前点
- 若
BFS
搜完发现最短路径数组dist
中没有终点单词,即dist.count(endWord) == 0
,说明字典中都没有终点单词或者通过字典中单词根本变不成终点单词,直接return
,防止进行不必要的DFS
注意:
- 对于
BFS
的生成的单词是否在字典中的判断,采用了unordered_set
来做,提前将其全部插入哈希表,判断为O(L)
- 对于
DFS
的生成的单词是否在字典中的判断,采用dist
数组来做,为什么不采用BFS
用到的S
数组呢?因为字典中不一定有起始单词,而dist
一定有
时间复杂度:
- 建图:见上面建图分析,为
O(26nL^2)
- 最短路BFS:每个点遍历一次,每次需要
O(L)
进行判断字典中是否存在或使用过,总共为O(nL)
- 搜索路径DFS:路径数量是指数级别的,记录方案需要
O(nL)
,总共为O(2^n nL)
终上为:O(26nL^2 + nL + 2^n nL) = O(2^n nL)
¶AC代码:
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小牛博客!
评论