LeetCode-126、单词接龙 II-困难

LeetCode-126、单词接龙 II-困难

给定两个单词(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" 不在字典中,所以不存在符合要求的转换序列。

代码:BFS + DFS

class Solution:
    def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:
        word_bag = set(wordList)
        if endWord not in word_bag:
            return []
        
        word_bag.add(beginWord)
        distance = self.bfs(endWord, word_bag)
        results = []

        self.dfs(beginWord, endWord, word_bag, distance, [beginWord], results)
        return results
    
    def bfs(self, begin_word, word_bag):
        queue = [begin_word]
        distance = {}
        distance[begin_word] = 0
        while queue:
            size = len(queue)
            for _ in range(size):
                curr_word = queue.pop(0)
                for next_word in self.get_next_words(curr_word, word_bag):
                    if next_word not in distance:
                        distance[next_word] = distance[curr_word] + 1
                        queue.append(next_word)
        return distance
    
    def get_next_words(self, curr_word, word_bag):
        next_words = []
        for i in range(len(curr_word)):
            for c in list(string.ascii_lowercase):
                next_word = curr_word[:i] + c + curr_word[i+1:]
                if next_word != curr_word and next_word in word_bag:
                    next_words.append(next_word)
        return next_words

    def dfs(self, curr_word, target, word_bag, distance, path, results):
        if curr_word == target:
            results.append(list(path))
            return
        for next_word in self.get_next_words(curr_word, word_bag):
            if distance[next_word] != distance[curr_word] - 1:
                continue
            path.append(next_word)
            self.dfs(next_word, target, word_bag, distance, path, results)
            path.pop()

参考:

评论:BFS + DFS,代码如上

题解:python,双向BFS,代码简短高效,逻辑清晰

发布了209 篇原创文章 · 获赞 48 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/clover_my/article/details/104642168