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
相关推荐
冰茶_16 分钟前
.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架
学习·microsoft·微软·c#·.net·xamarin
The Future is mine1 小时前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#
Demons_kirit2 小时前
LeetCode 2799、2840题解
算法·leetcode·职场和发展
软行2 小时前
LeetCode 每日一题 2845. 统计趣味子数组的数目
数据结构·c++·算法·leetcode
雾月553 小时前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
OpenC++4 小时前
【C++QT】Buttons 按钮控件详解
c++·经验分享·qt·leetcode·microsoft
এ᭄画画的北北5 小时前
力扣-160.相交链表
算法·leetcode·链表
mit6.8249 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode
Iotfsd9 小时前
.NET写的开源工业物联网网关(IoTGateway)
物联网·c#·.net·dotnet·边缘网关·雾计算·工业物联网智能网关
先生沉默先9 小时前
c#接口_抽象类_多态学习
开发语言·学习·c#