无法播放?请 点击这里 跳转到Youtube
切换视频源:
题目链接: https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leave
GitHub答案源代码请点击这里
class Solution {
public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
Map<String, Set<String>> map = new HashMap<>();
for (String w1 : wordList) {
Set<String> neis = new HashSet<>();
for (String w2 : wordList) {
if (oneChange(w1, w2)) {
neis.add(w2);
}
}
map.put(w1, neis);
}
Set<String> neis = new HashSet<>();
for (String w : wordList) {
if (oneChange(beginWord, w)) {
neis.add(w);
}
}
map.put(beginWord, neis);
if (!map.containsKey(endWord)) {
return new ArrayList<>();
}
Queue<String> queue = new LinkedList<>();
Map<String, List<String>> parents = new HashMap<>();
queue.offer(beginWord);
parents.put(beginWord, null);
while (!queue.isEmpty()) {
int size = queue.size();
Map<String, List<String>> tmp_parents = new HashMap<>();
for (int i = 0; i < size; i++) {
String cur = queue.poll();
for (String nei : map.get(cur)) {
if (!parents.containsKey(nei)) {
if (!tmp_parents.containsKey(nei)) {
queue.offer(nei);
}
tmp_parents.computeIfAbsent(nei, k -> new ArrayList<>()).add(cur);
}
}
}
parents.putAll(tmp_parents);
if (tmp_parents.containsKey(endWord)) {
List<List<String>> res = new ArrayList<>();
List<String> tmp = new LinkedList<>();
tmp.add(endWord);
dfs(res, parents, endWord, beginWord, tmp);
return res;
}
}
return new ArrayList<>();
}
private void dfs(List<List<String>> res, Map<String, List<String>> parents, String w, String beginWord, List<String> cur) {
if (w.equals(beginWord)) {
res.add(new ArrayList<>(cur));
return;
}
for (String prev : parents.get(w)) {
cur.add(0, prev);
dfs(res, parents, prev, beginWord, cur);
cur.remove(0);
}
}
private boolean oneChange(String w1, String w2) {
int diff = 0;
for (int i = 0; i < w1.length(); i++) {
if (w1.charAt(i) != w2.charAt(i)) {
diff++;
}
}
return diff == 1;
}
}