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 transformed word must exist in the word list. Note that beginWord is not a transformed word.
Note:
- Return an empty list if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
- You may assume no duplicates in the word list.
- 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: [ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]
Example 2:
Input: beginWord = "hit" endWord = "cog" wordList = ["hot","dot","dog","lot","log"] Output: [] Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.
题目给定beginWord,endWord以及一个wordList。返回beginWord到endWord的所有最短转换序列。
BFS(广度优先搜索)即可。如果只是求数量,应该会用C实现。但是要返回所有组合。C就太麻烦了。直接用Python水过。代码如下:
class Solution(object):
def findLadders(self, beginWord, endWord, wordList):
wordSet = set(wordList)#
res = []
layer = {} # 缓存所有搜索路径
layer[beginWord] = [[beginWord]]
while layer:
newlayer = collections.defaultdict(list)
for w in layer:
if w == endWord:
res.extend(k for k in layer[w])
else:
for i in range(len(w)):
for c in 'abcdefghijklmnopqrstuvwxyz': #遍历所有可能的跳转word,并检测是否在剩余wordSet中
neww = w[:i]+c+w[i+1:]
if neww in wordSet:
newlayer[neww]+=[j+[neww] for j in layer[w]]
wordSet -= set(newlayer.keys()) #移除已经使用过的word。
layer = newlayer
return res