2
* @param {string} beginWord3
* @param {string} endWord4
* @param {string[]} wordList8
// Logic is same as One direction, just from both side tword mid, much faster.9
// One Direction solution is here ->10
// https://leetcode.com/problems/word-ladder/discuss/2372376/Easy-Fast-Simple-83.95-235-ms-50.4-MB-One-Direction12
var ladderLength = function (beginWord, endWord, wordList) {13
const charMap = buildCharMap();14
const wordSet = new Set(wordList);15
if (!wordSet.has(endWord)) return 0;17
let leftSet = new Set([beginWord]),18
rightSet = new Set([endWord]),21
const helper = (set1, set2) => {22
const setArr = Array.from(set1);23
for (let i = 0; i < setArr.length; i++) {24
const word = setArr[i];25
for (let i = 0; i < word.length; i++) {26
for (const c of charMap) {27
const newWord = word.slice(0, i) + c + word.slice(i + 1);29
if (set2.has(newWord)) return true;30
if (wordSet.has(newWord)) {32
wordSet.delete(newWord);40
while (leftSet.size && rightSet.size) {42
if (helper(leftSet, rightSet)) return level;45
if (helper(rightSet, leftSet)) return level;51
const buildCharMap = () => {54
for (let i = 0; i < 26; i++) {55
map.push(String.fromCharCode(i + 97));