1
+ /**
2
+ * res.js
3
+ * @authors Joe Jiang ([email protected] )
4
+ * @date 2017-06-21 23:22:33
5
+ *
6
+ * 127. Word Ladder
7
+ * Problem: https://leetcode.com/problems/word-ladder/
8
+ * Discuss: https://discuss.leetcode.com/category/135/word-ladder
9
+ *
10
+ * * Traditional
11
+ * * Two-end BFS
12
+ * * Dijkstra's algorithm
13
+ *
14
+ * @param {string } beginWord
15
+ * @param {string } endWord
16
+ * @param {string[] } wordList
17
+ * @return {number }
18
+ */
19
+ let ladderLength = function ( beginWord , endWord , wordList ) {
20
+ wordList . push ( endWord ) ;
21
+ let toVisit = new Set ( ) ,
22
+ wordDict = new Set ( wordList ) ,
23
+ dist = 2 ;
24
+
25
+ if ( wordList . length === wordDict . size ) return 0 ;
26
+ addNextWords ( beginWord , wordDict , toVisit ) ;
27
+
28
+ while ( toVisit . size > 0 ) {
29
+ let entriesLen = toVisit . size ,
30
+ mark = 0 ;
31
+
32
+ for ( let item of toVisit . values ( ) ) {
33
+ if ( mark ++ === entriesLen ) break ;
34
+ toVisit . delete ( item ) ;
35
+
36
+ if ( item === endWord ) return dist ;
37
+ addNextWords ( item , wordDict , toVisit ) ;
38
+ }
39
+
40
+ dist ++ ;
41
+ }
42
+
43
+ return 0 ;
44
+ } ;
45
+
46
+ let addNextWords = function ( word , wordDict , toVisit ) {
47
+ wordDict . delete ( word ) ;
48
+ let len = word . length ;
49
+
50
+ for ( let i = 0 ; i < len ; i ++ ) {
51
+ for ( let j = 97 ; j < 123 ; j ++ ) {
52
+ let tmp = word . substring ( 0 , i ) + String . fromCharCode ( j ) + word . substring ( i + 1 , len ) ;
53
+ if ( wordDict . has ( tmp ) ) {
54
+ toVisit . add ( tmp ) ;
55
+ wordDict . delete ( tmp ) ;
56
+ }
57
+ }
58
+ }
59
+ } ;
0 commit comments