Leetcode 127 Word Ladder
阿新 • • 發佈:2020-10-25
題目介紹
給定開始的單詞beginWord
,結束的單詞endWord
,以及變化的詞表wordList
,判斷最少需要多少次,可以利用wordList
實現beginWord
到endWord
的轉變。每一次只能改變一個字母。
Examples:
Input: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] Output: 5 Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog", return its length 5. Input: beginWord = "hit" endWord = "cog" wordList = ["hot","dot","dog","lot","log"] Output: 0 Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.
Solution
可以使用BFS
來做,例如從hit
開始查詢只變化一位的單詞,再根據這個單詞尋找是否存在只變化一位的單詞…以此類推。而最終結果可以看成是一個樹的層高,所以需要使用佇列的思想,每次從左邊彈出,從右邊壓入。並且由於可能會遍歷到以前遍歷過的單詞,所以還需要標記是否已經使用過。如圖:
hit | hot / \ dot lot / \ / \ lot dog dot log (repeat) (repeat) | | cog cog (return)
如果不對重複的值加以判斷,那麼dot->lot->dot->...
會出現無盡的情況。
import string class Solution(object): def ladderLength(self, beginWord, endWord, wordList): """ :type beginWord: str :type endWord: str :type wordList: List[str] :rtype: int """ stack = [] if beginWord == endWord: return 1 # visited d = {} stack.append(beginWord) for word in wordList: d[word] = 1 d[beginWord] = 1 res = 1 while stack: length = len(stack) for i in range(length): # 從左邊彈出,保證是同層 word = stack.pop(0) # 去重,第二次出現必然會導致更長的結果 if word in d: del d[word] else: continue if word == endWord: return res for i in range(len(word)): for alpha in string.ascii_letters[:26]: tempword = word[:i] + alpha + word[i + 1:] if tempword in d: stack.append(tempword) # 每遍歷完一層,結果+1 res += 1 return 0