Skip to content

Commit 3fb050b

Browse files
126. Word Ladder II (java)
1 parent 393d096 commit 3fb050b

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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

Comments
 (0)