126. Word Ladder II
生活随笔
收集整理的這篇文章主要介紹了
126. Word Ladder II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Title
給定兩個單詞(beginWord 和 endWord)和一個字典 wordList,找出所有從 beginWord 到 endWord 的最短轉換序列。轉換需遵循如下規則:
每次轉換只能改變一個字母。
轉換過程中的中間單詞必須是字典中的單詞。
說明:
如果不存在這樣的轉換序列,返回一個空列表。
所有單詞具有相同的長度。
所有單詞只由小寫字母組成。
字典中不存在重復的單詞。
你可以假設 beginWord 和 endWord 是非空的,且二者不相同。
示例 1:
輸入:
beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]輸出:
[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"] ]示例 2:
輸入:
beginWord = "hit" endWord = "cog" wordList = ["hot","dot","dog","lot","log"]輸出:
[]解釋: endWord “cog” 不在字典中,所以不存在符合要求的轉換序列。
Solve
將所有單詞構建桶,便于查找鄰接詞。構建桶的方式是依次將一個詞的各個字母挖空,用字典進行保存
廣度優先搜索進行遍歷,這里構建三個數據結構:
- beFound:用于標記首次遍歷的詞,同時記錄首次遍歷的深度
- preWords:用一個默認列表字典記錄到達該節點的前溯詞列表,需注意對于每個可能搜索到該詞的路徑,只要深度不超過已有路徑,都應加入前溯詞列表
- toSeen:用一個雙端隊列存儲待遍歷詞及當前深度。
如果搜索到了目標節點endWord,則依次往前遞歸輸出解:每個解的頭節點若包含多個前溯詞,則解相應增加。利用python列表嵌套推導式實現。
Code
class Solution:def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:length = len(beginWord)wordList.append(beginWord)# 構建具有鄰接關系的桶buckets = defaultdict(list)for word in wordList:for i in range(length):match = word[:i] + '_' + word[i + 1:]buckets[match].append(word)print(buckets)# BFS遍歷preWords = defaultdict(list) # 前溯詞列表toSeen = deque([(beginWord, 1)]) # 待遍歷詞及深度列表beFound = {beginWord: 1} # 已探測詞詞列表while toSeen:curWord, level = toSeen.popleft()for i in range(len(beginWord)):match = curWord[:i] + '_' + curWord[i + 1:]for word in buckets[match]:if word not in beFound:beFound[word] = level + 1toSeen.append((word, level + 1))if beFound[word] == level + 1: # 當前深度等于該詞首次遍歷深度,則仍應加入前溯詞列表preWords[word].append(curWord)if endWord in beFound and level + 1 > beFound[endWord]: # 已搜索到目標詞,且完成當前層遍歷break# 列表推導式輸出結果if endWord in beFound:res = [[endWord]]while res[0][0] != beginWord:res = [[word] + r for r in res for word in preWords[r[0]]]return reselse:return []總結
以上是生活随笔為你收集整理的126. Word Ladder II的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: the NTP socket is in
- 下一篇: 990. Satisfiability