【LeetCode 中等题】58-单词接龙

题目描述:给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord到 endWord 的最短转换序列的长度。转换需遵循如下规则:

  1. 每次转换只能改变一个字母。
  2. 转换过程中的中间单词必须是字典中的单词。

说明:

  • 如果不存在这样的转换序列,返回 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" 不在字典中,所以无法进行转换。

解法1。用BFS,广度优先遍历不需要显式地建立图的结构,基本思路是用一个集合来表示可选单词的集合(为什么不是列表?因为我们不需要知道索引和重复情况,而集合的查询时间复杂度只有O(1))。

class Solution(object):
    def ladderLength(self, beginWord, endWord, wordList):
        """
        :type beginWord: str
        :type endWord: str
        :type wordList: List[str]
        :rtype: int
        """
        if beginWord == endWord:
            return 2
        elif not wordList:
            return 0
        wordSet = set(wordList)
        A = str(beginWord.lower())
        B = str(endWord.lower())
        
        q = [A]
        visited = set([A])
        res = 0
        #wordSet.add(B)
        while q:
            res += 1
            for i in range(len(q)):
                word = q.pop(0)
                if word == B:
                    return res
                
                for w in self.getNextWords(word):
                    if w not in wordSet or w in visited:
                        continue
                    q.append(w)
                    visited.add(w)    # 设置visited数组确保不重复处理词,也就是不形成环
        return 0
    
    def getNextWords(self, word):
        words = []
        for i in range(len(word)):
            for c in 'abcdefghijklmnopqrstuvwxyz':
                if word[i] == c:
                    continue
                new_one = word[:i]+c+word[i+1:]
                words.append(new_one)
                
        return words

参考链接:

https://www.jiuzhang.com/solution/word-ladder/#tag-highlight-lang-python

http://www.cnblogs.com/grandyang/p/4539768.html

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/86066658
今日推荐