力扣解题思路:127. 单词接龙

127. 单词接龙

思路:找出一条从 beginWord 到 endWord 的最短路径,每次移动规定为改变一个字符,并且改变之后的字符串必须在 wordList 中。从题目中可以看出,当两个单词只相差一个字符,就相当于这两个单词是存在相互连接的一条路径的,那么我们要做的是,找到从beginWord 到 endWord 的最短路径。->
显然,我们只需要从 beginWord开始遍历每个节点的邻接节点直到 endWord 即可,中心思想即为BFS。->
首先我们需要构造一个判断两个单词是否联通的一个函数:

public boolean canChange(String s,String t) {
 int len = s.length();
 int diff = 0;
 for (int i = 0; i < s.length(); i++) {
  if(s.charAt(i) != t.charAt(i))diff++;
 }
 return diff==1;
}

接下来开始BFS迭代,我们还需要一个marked数组来标记已遍历过的节点避免重复遍历:

boolean[] marked = new boolean[wordList.size()];

完整代码如下:

public int ladderLength(String beginWord, String endWord, List<String> wordList) {
    if(wordList.size() == 0) return 0;
    Queue<String> queue = new LinkedList<>();
    boolean[] marked = new boolean[wordList.size()];
    queue.add(beginWord);
    int layer = 1;
    while(!queue.isEmpty()){
        int size = queue.size();
        for(int i=0;i<size;i++){
            String cur = queue.poll();
            if(cur.equals(endWord)) return layer;
            for(int j=0;j<wordList.size();j++){
                if(marked[j]) continue;
                String dic = wordList.get(j);
                if(canChange(dic,cur)){
                    queue.add(dic);
                    marked[j] = true;
                }
            }
        }
        layer++;
    }
    return 0;
}

由BFS的特性,最先return的一定是最小的layer,即为最小路径,实际上BFS的迭代过程是非常有规律的,我们只需要根据特定的场景稍微进行调整即可。

你可能感兴趣的:(力扣解题思路:127. 单词接龙)