1. 程式人生 > 實用技巧 >Leetcode 127 Word Ladder

Leetcode 127 Word Ladder

題目介紹

給定開始的單詞beginWord,結束的單詞endWord,以及變化的詞表wordList,判斷最少需要多少次,可以利用wordList實現beginWordendWord的轉變。每一次只能改變一個字母。

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