【Leetcode】126. Word Ladder II(思路)

278 阅读2分钟

题目地址:

leetcode.com/problems/wo…

给定两个单词作为起点和终点,每一步允许从单词中改变某个位置的字母,变为另一个单词。再给定一个单词的列表,问从起点到终点的所有最短路径,要求路径中所有单词都要在列表里(起点不必在,终点必须在)。题目保证所有单词都由小写字母组成。

法1:BFS记录距离 + DFS(这是BFS找路径的标准做法)。如果列表里没有终点那直接返回空列表。接着先从起点单词开始BFS,搜的过程中用哈希表记录路径上每个单词与起点的距离。一旦搜到终点就停止搜索。设从起点到终点的最少步数是k,那么此时哈希表里已经存了所有距离起点k−1步以内的单词,以及一部分距离k步的单词(距离k步的单词我们只关心终点,虽然别的单词也可能会加进去)。接着我们从终点向起点DFS,一路永远找步数比当前位置少1的单词,直到搜到起点(之所以从终点搜,是因为如果从起点搜的话,即使每次搜的都是比自己步数多1的单词,但是有可能搜到第k步的时候搜到了别的单词。从终点开始搜的话能保证搜到第k步一定是起点)。代码如下:

import java.util.*;

public class Solution {
    public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
         
        
        // 特判一下,如果终点不在列表里则直接返回空
        
        
        // dist记录每个单词与起点的距离
         
        
        // 为了搜到终点就退出整个while循环,我们在while循环上加个label
       
         
                        // 注意,这里每个单词只允许加入dist一次,第一次加入的时候才是最小步数
                       
                        
                        // 搜到终点了就退出整个while循环
                       
                        
                  
    }
    
     
            // 如果搜到起点了,就记录答案
            // 由于是从终点开始搜的,加入答案的时候要反个序
            
            // 加入答案之后再翻回来
           
            // 回溯之前恢复现场
            
            // 这里要写dist.containsKey(next),因为起点不一定在set里
                      
}

有关链接:

  1. (7条消息) LC DFS、BFS与图论_edWard的博客-CSDN博客

  2. happygirlzt