题目描述:
给定两个单词(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;
};