剑指 Offer II 108. 单词演变

131 阅读1分钟

剑指 Offer II 108. 单词演变

在字典(单词列表) wordList 中,从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:

序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典 wordList 中的单词。 给定两个长度相同但内容不同的单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:5
解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5

代码实现

var ladderLength = function (beginWord, endWord, wordList) {
  var map = new Map();
  var map1 = new Map();
  var map2 = new Map();
  var res = 2;
  for (var word of wordList) {
    map.set(word);
  }
  if (!map.has(endWord)) return 0;
  map1.set(beginWord);
  map2.set(endWord);
  map.delete(endWord);
  while (map1.size !== 0 && map2.size !== 0) {
    var map3 = new Map();
    if (map1.size > map2.size) {
      [map1, map2] = [map2, map1];
    }
    for (var word of map1.keys()) {
      var arr = f(word);
      for (var item of arr) {
        if (map2.has(item)) {
          return res;
        }
        if (map.has(item)) {
          map3.set(item);
          map.delete(item);
        }
      }
    }
    res++;
    map1 = map3;
  }
  return 0;
  function f(word) {
    var arr = new Array();
    for (var i = 0; i < word.length; i++) {
      var brr = Array.from(word);
      var old = brr[i].charCodeAt(0);
      for (var j = 97; j <= 122; j++) {
        if (old !== j) {
          brr[i] = String.fromCharCode(j);
          arr.push(brr.join(""));
        }
      }
      brr = Array.from(word);
    }
    return arr;
  }
};