目录

leetcode - 127. Word Ladder

Description

A transformation sequence from word beginWord to word endWord using a dictionary wordList is a sequence of words beginWord -> s1 -> s2 -> ... -> sk such that:

Every adjacent pair of words differs by a single letter.

Every si for 1 <= i <= k is in wordList. Note that beginWord does not need to be in wordList.

sk == endWord

Given two words, beginWord and endWord, and a dictionary wordList, return the number of words in the shortest transformation sequence from beginWord to endWord, or 0 if no such sequence exists.

Example 1:

复制代码
Input: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
Output: 5
Explanation: One shortest transformation sequence is "hit" -> "hot" -> "dot" -> "dog" -> cog", which is 5 words long.

Example 2:

复制代码
Input: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
Output: 0
Explanation: The endWord "cog" is not in wordList, therefore there is no valid transformation sequence.

Constraints:

复制代码
1 <= beginWord.length <= 10
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWord, endWord, and wordList[i] consist of lowercase English letters.
beginWord != endWord
All the words in wordList are unique.

Solution

BFS, start with endWord, every time change one character to decide if we want to add this to the queue.

Time complexity: o ( n ∗ n ∗ w o r d . l e n + n ) o(n*n*word.len + n) o(n∗n∗word.len+n), where n is the length of wordList, word.len is the length of each word in wordList

Space complexity: o ( n ) o(n) o(n)

Code

python3 复制代码
class Solution:
    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
        queue = collections.deque([(endWord, 1)])
        visited = set()
        wordList = set(wordList)
        if endWord not in wordList:
            return 0
        while queue:
            cur_word, step = queue.popleft()
            if cur_word in visited:
                continue
            visited.add(cur_word)
            if cur_word == beginWord:
                return step
            for i in range(len(cur_word)):
                for new_char in 'abcdefghijklmnopqrstuvwxyz':
                    if new_char == cur_word[i]:
                        continue
                    new_word = f'{cur_word[:i]}{new_char}{cur_word[i+1:]}'
                    if new_word in wordList or new_word == beginWord:
                        queue.append((new_word, step + 1))
        return 0
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
梭七y12 分钟前
【力扣hot100题】(032)排序链表
算法·leetcode·链表
SsummerC13 分钟前
【leetcode100】数组中的第K个最大元素
python·算法·leetcode
编程绿豆侠17 分钟前
力扣HOT100之链表:206. 反转链表
算法·leetcode·链表
记得早睡~3 小时前
leetcode51-N皇后
javascript·算法·leetcode·typescript
鲤籽鲲6 小时前
C# System.Net.IPAddress 使用详解
网络·c#·.net
技术干货贩卖机6 小时前
Visio | 将(.vsdx)导出为更清楚/高质量的图片(.png) | 在Word里面的visio图
word·visio·paper·高清图片·矢量图片
luckyme_6 小时前
leetcode-代码随想录-哈希表-有效的字母异位词
算法·leetcode·散列表
luckyme_7 小时前
leetcode 代码随想录 数组-区间和
c++·算法·leetcode
敲敲敲-敲代码7 小时前
【MathType】MathType安装和嵌入word
word·mathtype
jyyyx的算法博客8 小时前
Leetcode 857 -- 贪心 | 数学
算法·leetcode·贪心·嗜血