题目
思路
1.BFS,找到从end到start的路径,找到每一个单词的层数。
2.DFS,根据每一个单词的层数,按照层数递减的顺序遍历。
代码
import string
class Solution:
"""
@param: start: a string
@param: end: a string
@param: dict: a set of string
@return: a list of lists of string
"""
def __init__(self):
self.res_list = []
def distanceOne(self, word, word_dict):
res_list = []
word = list(word)
for i, v in enumerate(word):
for c in string.ascii_lowercase:
if c != v:
word[i] = c
str_word = ''.join(word)
if str_word in word_dict and word_dict[str_word]:
res_list.append(str_word)
word[i] = v
return res_list
def bfs(self, start, end, word_list):
distance_dict = {}
distance_dict[end] = 1
queue = []
queue.append(end)
word_dict = {}
for word in word_list:
word_dict[word] = 1
word_dict[end] = 0
while queue:
word = queue[0]
queue.pop(0)
if word == start: return distance_dict
distance = distance_dict[word]
next_words = self.distanceOne(word, word_dict)
for word in next_words:
word_dict[word] = 0
distance_dict[word] = distance + 1
queue.append(word)
return None
def dfs(self, end, distance_dict, tmp_list, word, word_dict):
if word == end:
self.res_list.append(tmp_list[:])
return True
distance = distance_dict[word]
for word in self.distanceOne(word, word_dict):
if word in distance_dict and distance_dict[word] == distance - 1:
word_dict[word] = 0
tmp_list.append(word)
self.dfs(end, distance_dict, tmp_list, word, word_dict)
tmp_list.pop(-1)
word_dict[word] = 1
def findLadders(self, start, end, dict):
# write your code here
word_list = list(dict)
if start not in word_list:
word_list.append(start)
distance_dict = self.bfs(start, end, word_list)
if end not in word_list:
word_list.append(end)
if not distance_dict: return [[]]
word_dict = {}
word_dict[start] = 0
for word in word_list:
word_dict[word] = 1
self.dfs(end, distance_dict, [start], start, word_dict)
return self.res_list