LeetCode 126 Word Ladder II
2016-12-05 21:16
351 查看
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:
Only one letter can be changed at a time
Each intermediate word must exist in the word list
For example,
Given:
beginWord =
endWord =
wordList =
Return
Note:
All words have the same length.
All words contain only lowercase alphabetic characters.
Runtime: 28
ms beats 99.16% of java submissions.
先用HashMap<String, ArrayList<String>> map 通过bfs广度优先,存下最短路径的形成过程,map类似于一个有起点和终点的图,然后dfs深度优先,寻找起点到终点的具体路径。
public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) {
HashMap<String, ArrayList<String>> map = new HashMap();
Set<String> start = new HashSet(), end = new HashSet();
start.add(beginWord);
end.add(endWord);
BFS(start, end, wordList, map, true);
List<List<String>> result = new ArrayList();
List<String> cur = new ArrayList();
cur.add(beginWord);
DFS(beginWord, endWord, map, cur, result);
return result;
}
private void BFS(Set<String> start, Set<String> end, Set<String> wordList, HashMap<String,
ArrayList<String>> map, boolean forward) {
if (start.size() > end.size()) {//为了提高效率
BFS(end, start, wordList, map, !forward);//forward 是正向,还是从end开始反向
return;
}
wordList.removeAll(start);
wordList.removeAll(end);
boolean connected = false;
Set<String> set = new HashSet();
for (String s : start) {
char[] chars = s.toCharArray();
for (int i = 0, len = chars.length; i < len; i++) {
char ch = chars[i];
for (char x = 'a'; x <= 'z'; x++) {
chars[i] = x;
String word = new String(chars);
if (end.contains(word) || (!connected && wordList.contains(word))) {
if (end.contains(word)) connected = true;//找到最短的梯子,结束递归
else set.add(word);
if (forward) {
ArrayList<String> cur = map.getOrDefault(s, new ArrayList<>());
cur.add(word);
map.put(s, cur);
} else {
ArrayList<String> cur = map.getOrDefault(word, new ArrayList<>());
cur.add(s);
map.put(word, cur);
}
}
chars[i] = ch;
}
}
}
if (!connected && !set.isEmpty())
BFS(set, end, wordList, map, forward);
}
private void DFS(String start, String end, HashMap<String, ArrayList<String>> map, List<String>
cur, List<List<String>> result) {
if (start.equals(end)) {
result.add(new ArrayList(cur));//此处必须new ArrayList,因为cur是形参,会在递归中变化
return;
}
if (!map.containsKey(start)) return;
List<String> next = map.get(start);
for (String i : next) {
cur.add(i);
DFS(i, end, map, cur, result);
cur.remove(cur.size() - 1);
}
}
Only one letter can be changed at a time
Each intermediate word must exist in the word list
For example,
Given:
beginWord =
"hit"
endWord =
"cog"
wordList =
["hot","dot","dog","lot","log"]
Return
[ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]
Note:
All words have the same length.
All words contain only lowercase alphabetic characters.
Runtime: 28
ms beats 99.16% of java submissions.
先用HashMap<String, ArrayList<String>> map 通过bfs广度优先,存下最短路径的形成过程,map类似于一个有起点和终点的图,然后dfs深度优先,寻找起点到终点的具体路径。
public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) {
HashMap<String, ArrayList<String>> map = new HashMap();
Set<String> start = new HashSet(), end = new HashSet();
start.add(beginWord);
end.add(endWord);
BFS(start, end, wordList, map, true);
List<List<String>> result = new ArrayList();
List<String> cur = new ArrayList();
cur.add(beginWord);
DFS(beginWord, endWord, map, cur, result);
return result;
}
private void BFS(Set<String> start, Set<String> end, Set<String> wordList, HashMap<String,
ArrayList<String>> map, boolean forward) {
if (start.size() > end.size()) {//为了提高效率
BFS(end, start, wordList, map, !forward);//forward 是正向,还是从end开始反向
return;
}
wordList.removeAll(start);
wordList.removeAll(end);
boolean connected = false;
Set<String> set = new HashSet();
for (String s : start) {
char[] chars = s.toCharArray();
for (int i = 0, len = chars.length; i < len; i++) {
char ch = chars[i];
for (char x = 'a'; x <= 'z'; x++) {
chars[i] = x;
String word = new String(chars);
if (end.contains(word) || (!connected && wordList.contains(word))) {
if (end.contains(word)) connected = true;//找到最短的梯子,结束递归
else set.add(word);
if (forward) {
ArrayList<String> cur = map.getOrDefault(s, new ArrayList<>());
cur.add(word);
map.put(s, cur);
} else {
ArrayList<String> cur = map.getOrDefault(word, new ArrayList<>());
cur.add(s);
map.put(word, cur);
}
}
chars[i] = ch;
}
}
}
if (!connected && !set.isEmpty())
BFS(set, end, wordList, map, forward);
}
private void DFS(String start, String end, HashMap<String, ArrayList<String>> map, List<String>
cur, List<List<String>> result) {
if (start.equals(end)) {
result.add(new ArrayList(cur));//此处必须new ArrayList,因为cur是形参,会在递归中变化
return;
}
if (!map.containsKey(start)) return;
List<String> next = map.get(start);
for (String i : next) {
cur.add(i);
DFS(i, end, map, cur, result);
cur.remove(cur.size() - 1);
}
}
相关文章推荐
- [leetcode] 126 Word Ladder ii bfs dfs
- Leetcode 126. Word Ladder II
- leetcode 126. Word Ladder II
- LeetCode 126. Word Ladder II(单词梯子)
- Leetcode 126. Word Ladder II
- [LeetCode] 126. Word Ladder II 词语阶梯 II
- leetcode[126]Word Ladder II
- leetcode_c++:Word Ladder II(126)
- [LeetCode 126] - 单词梯II(Word Ladder II)
- [LeetCode]题解(python):126-Word Ladder II
- [LeetCode] 126. Word Ladder II
- Leetcode 126. Word Ladder II
- [leetcode 126] Word Ladder II
- LeetCode[126.Word Ladder II]题解 难度[hard]
- [leetcode]126. Word LadderII@Java解题报告
- Leetcode 126. Word Ladder II 字符变换2 解题报告
- LeetCode力扣之126. Word Ladder II
- Leetcode 126 word ladder II
- [Leetcode] 126. Word Ladder II 解题报告
- leetcode126 Word Ladder II