举例:
给定字典中的两个词,长度相等。写一个方法,把一个词转换成另一个词, 但是一次只能改变一个字符。每一步得到的新词都必须能在字典中找到。
编写一个程序,返回一个可能的转换序列。如有多个可能的转换序列,你可以返回任何一个。
示例 1:
输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]
输出:
["hit","hot","dot","lot","log","cog"]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-transformer-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
DFS 深度优先搜索,采用stack后进先出模式
class Solution:
def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[str]:
# DFS
hashmap = collections.defaultdict(list)
for word in wordList:
for i in range(len(word)):
hashmap[word[:i] + '*' + word[i + 1:]].append(word)
stack = [beginWord]
w_dict = {beginWord: [beginWord]}
while stack:
word = stack.pop()
if word == endWord:
return w_dict[word]
for i in range(len(word)):
if word[:i] + '*' + word[i + 1:] in hashmap:
for tmp in hashmap[word[:i] + '*' + word[i + 1:]]:
if tmp not in w_dict:
w_dict[tmp] = w_dict[word] + [tmp]
stack.append(tmp)
return []
BFS 广度优先搜索,采用队列queue先进先出
class Solution:
def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[str]:
# BFS
hashmap = collections.defaultdict(list)
for word in wordList:
for i in range(len(word)):
hashmap[word[:i]+"*"+word[i+1:]].append(word)
queue = collections.deque([beginWord])
w_dict = {beginWord:[beginWord]}
while queue:
word = queue.popleft()
if word == endWord:
return w_dict[word]
for i in range(len(word)):
if word[:i]+"*"+word[i+1:] in hashmap:
for tmp in hashmap[word[:i]+"*"+word[i+1:]]:
w_dict[tmp] = w_dict[word]+[tmp]
queue.append(tmp)
return []