126. 单词接龙 II
给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:
每次转换只能改变一个字母。
转换后得到的单词必须是字典中的单词。
说明:
如果不存在这样的转换序列,返回一个空列表。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
示例 1:
输入:
beginWord = “hit”,
endWord = “cog”,
wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
输出:
[
[“hit”,“hot”,“dot”,“dog”,“cog”],
[“hit”,“hot”,“lot”,“log”,“cog”]
]
# 参考了126和127题官解
class Solution:
def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:
import collections
ans = []
steps = float("inf")
if not beginWord or not endWord or not wordList or endWord not in wordList:
return []
word_dict = collections.defaultdict(list)
L = len(beginWord)
for word in wordList:
for i in range(L):
word_dict[word[:i] + "*" + word[i+1:]].append(word)
queue = [[beginWord]]
cost = {beginWord : 0}
while queue:
words_list= queue.pop(0)
cur_word = words_list[-1]
if cur_word == endWord:
ans.append(words_list[:])
else:
for i in range(L):
intermediate_word = cur_word[:i] + "*" + cur_word[i+1:]
for word in word_dict[intermediate_word]:
w_l_temp = words_list[:]
if word not in cost or cost[word] >= cost[cur_word] + 1:
cost[word] = cost[cur_word] + 1
w_l_temp.append(word)
queue.append(w_l_temp[:])
# word_dict[intermediate_word] = []
return ans