写点什么

LeetCode 题解:127. 单词接龙,BFS+ 统计单词变化次数,JavaScript,详细注释

用户头像
Lee Chen
关注
发布于: 2020 年 12 月 16 日
LeetCode题解:127. 单词接龙,BFS+统计单词变化次数,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/word-ladder/



解题思路:



  1. 使用队列进行遍历,队列中按顺序存储了每一层的元素。

  2. 每次循环时,将队列中当前层的元素依次取出,然后在wordList中查找只变化一次的单词,将其作为下一层遍历的元素,再放入队列中。

  3. 将wordList中的元素都存储在Set中,每个被使用过的单词都从Set中删除,避免重复查询。

  4. 由于BFS是逐层进行遍历,一旦遇到单词与目标单词相等,即为找到了最小变化次数,可以退出循环。

  5. 需要注意的测试用例:



"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;
};



发布于: 2020 年 12 月 16 日阅读数: 16
用户头像

Lee Chen

关注

还未添加个人签名 2018.08.29 加入

还未添加个人简介

评论 (2 条评论)

发布
用户头像
如果有时间复杂度,空间复杂度分析那就更好啦
2020 年 12 月 18 日 16:57
回复
这个倒是,不过我觉得这块经常还有点迷惑。
2020 年 12 月 19 日 16:17
回复
没有更多了
LeetCode题解:127. 单词接龙,BFS+统计单词变化次数,JavaScript,详细注释