1
+ class Solution {
2
+ private boolean isConnected = false ;
3
+ private Map <String , List <String >> hs ;
4
+ public List <List <String >> findLadders (String beginWord , String endWord , List <String > wordList ) {
5
+ hs = new HashMap <>(16 );
6
+ List <List <String >> result = new ArrayList <>();
7
+ if (!wordList .contains (endWord ))
8
+ return result ;
9
+ HashSet <String > dict = new HashSet <>(wordList );
10
+ Set <String > fwd = new HashSet <>();
11
+ fwd .add (beginWord );
12
+ Set <String > bwd = new HashSet <>();
13
+ bwd .add (endWord );
14
+ bfs (fwd , bwd , dict , false );
15
+ if (!isConnected ) return result ;
16
+ List <String > temp = new ArrayList <>();
17
+ temp .add (beginWord );
18
+ dfs (result , temp , beginWord , endWord );
19
+ return result ;
20
+ }
21
+ private void bfs (Set <String > forward , Set <String > backward , Set <String > dict , boolean swap ){
22
+ if (forward .isEmpty () || backward .isEmpty ()) return ;
23
+ if (forward .size () > backward .size ()){
24
+ bfs (backward , forward , dict , !swap );
25
+ return ;
26
+ }
27
+ dict .removeAll (forward );
28
+ dict .removeAll (backward );
29
+ Set <String > set3 = new HashSet <>();
30
+ for (String str : forward )
31
+ for (int i = 0 ; i < str .length (); i ++) {
32
+ char [] ary = str .toCharArray ();
33
+ for (char j = 'a' ; j <= 'z' ; j ++) {
34
+ ary [i ] = j ;
35
+ String temp = new String (ary );
36
+ if (!backward .contains (temp ) && !dict .contains (temp )) continue ;
37
+ String key = !swap ? str : temp ;
38
+ String val = !swap ? temp : str ;
39
+ if (!hs .containsKey (key )) hs .put (key , new ArrayList <>());
40
+ if (backward .contains (temp )) {
41
+ hs .get (key ).add (val );
42
+ isConnected = true ;
43
+ }
44
+ if (!isConnected && dict .contains (temp )) {
45
+ hs .get (key ).add (val );
46
+ set3 .add (temp );
47
+ }
48
+ }
49
+ }
50
+ if (!isConnected ) bfs (set3 , backward , dict , swap );
51
+ }
52
+ private void dfs (List <List <String >> result , List <String > temp , String start , String end ){
53
+ if (start .equals (end )){
54
+ result .add (new ArrayList <>(temp ));
55
+ return ;
56
+ }
57
+ if (!hs .containsKey (start )) return ;
58
+ for (String s : hs .get (start )){
59
+ temp .add (s );
60
+ dfs (result , temp , s , end );
61
+ temp .remove (temp .size ()-1 );
62
+ }
63
+ }
64
+ }
0 commit comments