leetcode BFS解题思路
-
Word Ladder
思路一:单向bfs, 使用visited数组记录哪些已经访问过了, 访问过的就不允许再次入队, 同时这里想到的是使用26个英文字母,枚举可能的取值, 类似brute force
思路二:双向bfs,使用两个set,这里没有使用queue,是因为需要在queue里查询,不方便.
另外,需要注意的一点是,每次遍历时,都是取size较小的来做搜索,初始时,各插入头和尾,之后每次取最小的set来拓展, 这样就实现了交替访问两个set,
是两者的高度在 l/2, 这样可以缩短一半的时间 -
单词接龙 II
思路一:因为要存储最终的结果,所以图是一定要建立的,通常我们可以通过维护每个节点的子节点,即一个map,每个map里是一个数组
我们可以称之为children数组或者parent数组
2)每遍历一层节点后,从wordlist中删除掉这些节点,因为本题是有源节点的,从源节点看,前一层的节点不应该再次被遍历,因为长度变长了
3)对于重复的问题,可以使用hastset来解
4)最后通过dfs,遍历输出结果
思路二:双向bfs + dfs
解法跟思路一类似,只是需要创建两个set,然后需要不断交换两个set
-
Race Car
思路一:bfs解法有一个重要的技巧,即利用一个set,记录已经出现过的路径,这样bfs枚举到重复路径时,可以直接跳过,这是一个有效的prunning method. -
Open the Lock
找最小步骤, 通常反应是使用BFS或者动态规划
思路一: BFS
BFS通过存储上一层的状态, 来推出下一层状态, 如此循环, 直到找到期望的值. 如果采用两个set去加速BFS, 需要注意全局的visited数组需要在入队之后再赋值, 因为如果在入队(入set)之前进行判断,
那么begin set和end set中就不可能出现相同的元素了, 这样永远得不到结果. 只有允许先入队元素, 再出队时,先判断是否找到解之后, 才可以根据是否visit过来过滤