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
相关推荐
leoufung15 分钟前
LeetCode 61. 旋转链表(Rotate List)题解与思路详解
leetcode·链表·list
周杰伦fans3 小时前
[特殊字符] 代理模式超详细讲解 ——.NET
数据库·c#·代理模式
用户8356290780514 小时前
C# 高效生成 Word 表格:复杂表格创建实战指南
后端·c#
屠夫4 小时前
C# LINQ
c#
leoufung5 小时前
逆波兰表达式 LeetCode 题解及相关思路笔记
linux·笔记·leetcode
光头闪亮亮6 小时前
电子发票解析工具-c#桌面应用开发-DataGridView表格控件使用详解
c#
周杰伦fans7 小时前
C# 中的 `Hashtable`
开发语言·c#
lingggggaaaa7 小时前
免杀对抗——C2远控篇&PowerShell&有无文件落地&C#参数调用&绕AMSI&ETW&去混淆特征
c语言·开发语言·笔记·学习·安全·microsoft·c#
Aspect of twilight7 小时前
LeetCode华为大模型岗刷题
python·leetcode·华为·力扣·算法题
咩图7 小时前
WPF+Prism8.0.0.1909+C#创建一个桌面程序
c#·wpf·prism