# 单词接龙 II

按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> ... -> sk 这样的单词序列,并满足:

给你两个单词 beginWordendWord ,以及一个字典 wordList 。请你找出并返回所有从 beginWordendWord最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 [beginWord, s1, s2, ..., sk] 的形式返回。

 

示例 1:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]
解释:存在 2 种最短的转换序列:
"hit" -> "hot" -> "dot" -> "dog" -> "cog"
"hit" -> "hot" -> "lot" -> "log" -> "cog"

示例 2:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:[]
解释:endWord "cog" 不在字典 wordList 中,所以不存在符合要求的转换序列。

 

提示:

## template ```java class Solution { public List> findLadders(String beginWord, String endWord, List wordList) { List> res = new ArrayList<>(); if (wordList == null) return res; Set dicts = new HashSet<>(wordList); if (!dicts.contains(endWord)) return res; if (dicts.contains(beginWord)) dicts.remove(beginWord); Set endList = new HashSet<>(), beginList = new HashSet<>(); Map> map = new HashMap<>(); beginList.add(beginWord); endList.add(endWord); bfs(map, beginList, endList, beginWord, endWord, dicts, false); List subList = new ArrayList<>(); subList.add(beginWord); dfs(map, res, subList, beginWord, endWord); return res; } void dfs(Map> map, List> result, List subList, String beginWord, String endWord) { if (beginWord.equals(endWord)) { result.add(new ArrayList<>(subList)); return; } if (!map.containsKey(beginWord)) { return; } for (String word : map.get(beginWord)) { subList.add(word); dfs(map, result, subList, word, endWord); subList.remove(subList.size() - 1); } } void bfs(Map> map, Set beginList, Set endList, String beginWord, String endWord, Set wordList, boolean reverse) { if (beginList.size() == 0) return; wordList.removeAll(beginList); boolean finish = false; Set temp = new HashSet<>(); for (String str : beginList) { char[] charr = str.toCharArray(); for (int chI = 0; chI < charr.length; chI++) { char old = charr[chI]; for (char ch = 'a'; ch <= 'z'; ch++) { if (ch == old) continue; charr[chI] = ch; String newstr = new String(charr); if (!wordList.contains(newstr)) { continue; } if (endList.contains(newstr)) { finish = true; } else { temp.add(newstr); } String key = reverse ? newstr : str; String value = reverse ? str : newstr; if (!map.containsKey(key)) { map.put(key, new ArrayList<>()); } map.get(key).add(value); } charr[chI] = old; } } if (!finish) { if (temp.size() > endList.size()) { bfs(map, endList, temp, beginWord, endWord, wordList, !reverse); } else { bfs(map, temp, endList, beginWord, endWord, wordList, reverse); } } } } ``` ## 答案 ```java ``` ## 选项 ### A ```java ``` ### B ```java ``` ### C ```java ```