1
/**
2
* @param {string} beginWord
3
* @param {string} endWord
4
* @param {string[]} wordList
5
* @return {number}
6
*/
7

8
// 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-Direction
11

12
var ladderLength = function (beginWord, endWord, wordList) {
13
const charMap = buildCharMap();
14
const wordSet = new Set(wordList);
15
if (!wordSet.has(endWord)) return 0;
16

17
let leftSet = new Set([beginWord]),
18
rightSet = new Set([endWord]),
19
level = 1;
20

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);
28

29
if (set2.has(newWord)) return true;
30
if (wordSet.has(newWord)) {
31
set1.add(newWord);
32
wordSet.delete(newWord);
33
}
34
}
35
}
36
set1.delete(word);
37
}
38
};
39

40
while (leftSet.size && rightSet.size) {
41
level++;
42
if (helper(leftSet, rightSet)) return level;
43

44
level++;
45
if (helper(rightSet, leftSet)) return level;
46
}
47

48
return 0;
49
};
50

51
const buildCharMap = () => {
52
const map = [];
53

54
for (let i = 0; i < 26; i++) {
55
map.push(String.fromCharCode(i + 97));
56
}
57

58
return map;
59
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0