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;
};
上一篇:LeetCode 127. 单词接龙---Java题解


下一篇:【java学习】Servlet简单的表单程序(一)