在字典(单词列表) 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;
}
};