-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path127_Word_Ladder.java
More file actions
107 lines (78 loc) · 2.81 KB
/
127_Word_Ladder.java
File metadata and controls
107 lines (78 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
Given two words (beginWord and endWord), and a dictionary's word list, find
the length of shortest transformation sequence from beginWord to endWord, such
that:
1. Only one letter can be changed at a time.
2. Each transformed word must exist in the word list. Note that beginWord is
not a transformed word.
Note:
1. Return 0 if there is no such transformation sequence.
2. All words have the same length.
3. All words contain only lowercase alphabetic characters.
4. You may assume no duplicates in the word list.
5. You may assume beginWord and endWord are non-empty and are not the same.
Example 1:
Input:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]
Output: 5
Explanation: As one shortest transformation is
"hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.
Example 2:
Input:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]
Output: 0
Explanation: The endWord "cog" is not in wordList, therefore no
possible transformation.
*/
import java.util.HashSet;
import java.util.List;
import java.util.Set;
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
Set<String> dict = new HashSet<>(wordList);
if (!dict.contains(endWord)) {
return 0;
}
Set<String> beginSet = new HashSet<>();
beginSet.add(beginWord);
Set<String> endSet = new HashSet<>();
endSet.add(endWord);
return search(beginSet, endSet, dict, 1);
}
private int search(
Set<String> beginSet, Set<String> endSet, Set<String> dict,
int existingWordNumbers) {
if (beginSet.isEmpty() || endSet.isEmpty()) {
return 0;
}
existingWordNumbers++;
dict.removeAll(beginSet);
Set<String> nextLayerSet = new HashSet<>();
for (String str : beginSet) {
char[] chs = str.toCharArray();
for (int i = 0; i < chs.length; i++) {
char c = chs[i];
for (char j = 'a'; j <= 'z'; j++) {
chs[i] = j;
String tmp = new String(chs);
if (!dict.contains(tmp)) {
continue;
}
if (endSet.contains(tmp)) {
return existingWordNumbers;
}
nextLayerSet.add(tmp);
}
chs[i] = c;
}
}
return nextLayerSet.size() > endSet.size() ?
search(endSet, nextLayerSet, dict, existingWordNumbers) :
search(nextLayerSet, endSet, dict, existingWordNumbers);
}
}