LetCode-127.单词接龙

132 阅读1分钟

题目描述:

给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。

示例 1:

输入:

beginWord = "hit",

endWord = "cog",

wordList = ["hot","dot","dog","lot","log","cog"]

输出: 5

解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",返回它的长度 5。

代码:

var ladderLength = function(beginWord, endWord, wordList) {

  //利用数组生成一个set 便于后期遍历到符合条件的单词将其移除,避免重复遍历
  let wordSet = new Set(wordList);
  //首先判断这个set里是否存在endWord 不存在的话,直接返回0
  if(wordSet.has(endWord)){
      //将beginWord作为第一个进行遍历查找的字符串
      let queue = [[beginWord,1]];
      while(queue.length){
          let [wordStr,count] = queue.shift();
          for(let i = 0; i < wordStr.length; i++){
              //以hit 为例 查找 *it、h*t、hi* (*为a-z的所有情况) 的所有组合,判断set中是否有符合条件的,有即作为下一次循环的字符串
              for(let j = 97; j < 123; j++){
                  let newWord = wordStr.slice(0,i) + String.fromCharCode(j) + wordStr.slice(i + 1);
                  if(wordSet.has(newWord)){
                      //找到endWord后 遍历结束
                      if(newWord === endWord){
                          return count + 1;
                      }
                      queue.push([newWord, count + 1]);
                      wordSet.delete(newWord);
                  }  
              }
          }
      }
  }  
  return 0;
};