Leetcode練習(Python):廣度優先搜索類:第127題:單詞接龍:給定兩個單詞(beginWord 和 endWord)和一個字典,找到從 beginWord 到 endWord 的最短轉換序列的長度。轉換需遵循如下規則: 每次轉換只能改變一個字母。 轉換過程中的中間單詞必須是字典中的單詞。


題目:

單詞接龍:給定兩個單詞(beginWord 和 endWord)和一個字典,找到從 beginWord 到 endWord 的最短轉換序列的長度。轉換需遵循如下規則:  每次轉換只能改變一個字母。 轉換過程中的中間單詞必須是字典中的單詞。 

說明:

如果不存在這樣的轉換序列,返回 0。
所有單詞具有相同的長度。
所有單詞只由小寫字母組成。
字典中不存在重復的單詞。
你可以假設 beginWord 和 endWord 是非空的,且二者不相同。
示例 1:

輸入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

輸出: 5

解釋: 一個最短轉換序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",
返回它的長度 5。
示例 2:

輸入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

輸出: 0

解釋: endWord "cog" 不在字典中,所以無法進行轉換。

思路:

深度優先使用棧,廣度優先使用隊列。

程序:

from collections import deque
class Solution:
    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
        if endWord not in wordList:
            return 0
        # 單詞中缺少一個字母的單詞組合
        def make_dict(wordList):
            myDcit = {}
            for word in wordList:
                for index in range(len(word)):
                    auxiliary = word[: index] + '_' + word[index + 1 :]
                    myDcit[auxiliary] = myDcit.get(auxiliary, []) + [word]
            return myDcit
        # 廣度優先
        def bfs(beginWord, endWord, myDcit):
            # 初始設置為第一步
            queue = deque([(beginWord, 1)])
            # 保存訪問過的單詞
            visited = set()
            while queue:
                word, step = queue.popleft()
                # 訪問沒有訪問過的單詞
                if word not in visited:
                    # 現在訪問了
                    visited.add(word)
                    # 判斷是否得到結果
                    if word == endWord:
                        return step
                    for index in range(len(word)):
                        # 按照現在的word進行查找
                        auxiliary = word[: index] + '_' + word[index + 1 :]
                        neighbors = myDcit.get(auxiliary, [])
                        for neighbor in neighbors:
                            if neighbor not in visited:
                                queue.append((neighbor, step + 1))
            return 0
        myDcit = make_dict(wordList)
        return bfs(beginWord, endWord, myDcit)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM