本题要求的是最短转换序列的长度,看到最短首先想到的就是广度优先搜索。想到广度优先搜索自然而然的就能想到图,但是本题并没有直截了当的给出图的模型,因此需要按照题意把它抽象成图的模型。
python">class Solution:
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
edge = dict() # 记录无向图中每个单词的连接单词
visited = dict() # 记录单词是否被访问过,避免死循环
res = 1 # beginWord本身为一个长度
# 快速查找endWord是否在wordList中
for word in wordList:
edge[word] = []
if endWord not in edge:
return 0
# 将beginWord纳入wordList中,以在后续建图过程中将其划入图中
if beginWord not in edge:
edge[beginWord] = []
wordList = [beginWord] + wordList
# 建图时间复杂度O(N*C*26),比两两单词判断(O(N*N*C))快
for word in wordList:
list_word = list(word)
n = len(list_word)
for i in range(n):
tmp = list_word[i]
for k in range(26):
list_word[i] = chr(ord('a') + k)
newWord = ''.join(list_word)
if newWord in edge and newWord != word:
edge[word].append(newWord)
list_word[i] = tmp
queue = [beginWord] # 以beginWord为起点,开始BFS过程
while queue:
current = len(queue)
for _ in range(current):
node = queue[0]
queue.pop(0)
visited[node] = True
for vertex in edge[node]:
if vertex == endWord:
return res + 1
if vertex not in visited:
queue.append(vertex)
res += 1
return 0