LeetCode题解:127. 单词接龙,BFS+统计单词变化次数,JavaScript,详细注释
作者:互联网
原题链接:https://leetcode-cn.com/problems/word-ladder/
解题思路:
- 使用队列进行遍历,队列中按顺序存储了每一层的元素。
- 每次循环时,将队列中当前层的元素依次取出,然后在wordList中查找只变化一次的单词,将其作为下一层遍历的元素,再放入队列中。
- 将wordList中的元素都存储在Set中,每个被使用过的单词都从Set中删除,避免重复查询。
- 由于BFS是逐层进行遍历,一旦遇到单词与目标单词相等,即为找到了最小变化次数,可以退出循环。
- 需要注意的测试用例:
"ymain"
"oecij"
["ymann","yycrj","oecij","ymcnj","yzcrj","yycij","xecij","yecij","ymanj","yzcnj","ymain"]
/**
* @param {string} beginWord
* @param {string} endWord
* @param {string[]} wordList
* @return {number}
*/
var ladderLength = function (beginWord, endWord, wordList) {
let queue = [beginWord]; // 在队列中存储起始单词,用于开始循环
// 将wordList存储为Set,在遍历时删除已走过的单词,以减少不必要的遍历次数
let wordSet = new Set(wordList); //
// 需要返回转换单词的长度,beginWord的长度也要计算在内,因此初始长度为1
let count = 1;
// 使用队列进行BFS
while (queue.length) {
// 缓存当前队列中的元素数量,即为当前层的元素数量
let queueLength = queue.length;
// 进行queueLength次遍历
while (--queueLength >= 0) {
// 从当前层的队列中取出一个单词,用于查找与他相差一个字母的单词
let str = queue.shift();
// 查找Set中的单词,
for (const word of wordSet) {
let diff = 0; // 统计字母差异数量,找出字母相差数量一个的单词
// 遍历每个字母,对比字母变化的数量
for (let i = 0; i < word.length; i++) {
// 如果字母数量有变化,则计数
if (str[i] !== word[i]) {
diff++;
// 字母相差超过一个,就不是本次变化的选项,退出循环
if (diff > 1) {
break;
}
}
}
// 字母变化一个时,选中当前单词作为变化路径
if (diff === 1) {
// 如果当前的变化已和目标一致,则返回当路径长度
if (word === endWord) {
return count + 1;
}
// 从Set中删除当前已选中的单词,避免重复选中
wordSet.delete(word);
// 将当前单词存入队列,用于下一层循环
queue.push(word);
}
}
}
// 每完成一层遍历,将路径长度加一
count++;
}
// 如果没有在循环中退出,表示未找到路径,直接返回0
return 0;
};
标签:wordList,BFS,遍历,word,队列,题解,单词,let 来源: https://blog.csdn.net/chencl1986/article/details/111254106