
class Solution:
def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[str]:
def change_only_first_element(first, second):
if len(first) != len(second):
return False
count = 0
for i in range(len(first)):
if first[i] != second[i]:
count += 1
return count == 1
"""
# 超时了...
ans = []
# 如果目标词不再字典中,就不能转换
if endWord not in wordList:
return ans
# 先存放第一个词
queue = [beginWord]
# 判断是否找到了
flag = False
# 存 与当前字符只变换一个的情况
dic = collections.OrderedDict()
# 标记单词是否被访问过
visited = [False] * len(wordList)
while queue:
# 取第一个元素
queueHead = queue.pop(0)
# 如果这个元素就是目标endWord元素,则直接返回答案
if queueHead == endWord:
flag = True
break
# 在字典中寻找可能的转换情况,加入队列,同时将能够从当前只变换一个字符的情况存起来
for i in range(len(wordList)):
# 该词未被访问的情况,且能够转换
if not visited[i] and change_only_first_element(wordList[i], queueHead)==True:
queue.append(wordList[i])
visited[i] = True
dic[wordList[i]] = queueHead
# print(dic)
if not flag:
return ans
key = endWord
while dic[key] != beginWord:
ans.append(key)
key = dic[key]
ans.append(key)
ans.append(dic[key])
return ans[::-1]
"""
def dfs(curWord,endWord,wordList):
if curWord == endWord:
return True
n = len(wordList)
for i in range(n):
if self.visited[i]==True or change_only_first_element(curWord,wordList[i])==False:
continue
self.visited[i] = True
self.path.append(wordList[i])
if dfs(wordList[i],endWord,wordList)==True:
return True
self.path.pop(-1)
return False
n = len(wordList)
self.visited = [False]*n
self.path = [beginWord]
if dfs(beginWord,endWord,wordList)==True:
return self.path[:]
else:
return []