LeetCode 题解工作台

单词接龙 II

按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s 1 -> s 2 -> ... -> s k 这样的单词序列,并满足: 每对相邻的单词之间仅有单个字母不同。 转换过程中的每个单词 s i (…

category

4

题型

code_blocks

3

代码语言

hub

3

相关题

当前训练重点

困难 · 回溯·pruning

bolt

答案摘要

class Solution: def findLadders(

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 回溯·pruning 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> ... -> sk 这样的单词序列,并满足:

  • 每对相邻的单词之间仅有单个字母不同。
  • 转换过程中的每个单词 si1 <= i <= k)必须是字典 wordList 中的单词。注意,beginWord 不必是字典 wordList 中的单词。
  • sk == endWord

给你两个单词 beginWordendWord ,以及一个字典 wordList 。请你找出并返回所有从 beginWordendWord最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 [beginWord, s1, s2, ..., sk] 的形式返回。

 

示例 1:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]
解释:存在 2 种最短的转换序列:
"hit" -> "hot" -> "dot" -> "dog" -> "cog"
"hit" -> "hot" -> "lot" -> "log" -> "cog"

示例 2:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:[]
解释:endWord "cog" 不在字典 wordList 中,所以不存在符合要求的转换序列。

 

提示:

  • 1 <= beginWord.length <= 5
  • endWord.length == beginWord.length
  • 1 <= wordList.length <= 500
  • wordList[i].length == beginWord.length
  • beginWordendWordwordList[i] 由小写英文字母组成
  • beginWord != endWord
  • wordList 中的所有单词 互不相同
lightbulb

解题思路

方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Solution:
    def findLadders(
        self, beginWord: str, endWord: str, wordList: List[str]
    ) -> List[List[str]]:
        def dfs(path, cur):
            if cur == beginWord:
                ans.append(path[::-1])
                return
            for precursor in prev[cur]:
                path.append(precursor)
                dfs(path, precursor)
                path.pop()

        ans = []
        words = set(wordList)
        if endWord not in words:
            return ans
        words.discard(beginWord)
        dist = {beginWord: 0}
        prev = defaultdict(set)
        q = deque([beginWord])
        found = False
        step = 0
        while q and not found:
            step += 1
            for i in range(len(q), 0, -1):
                p = q.popleft()
                s = list(p)
                for i in range(len(s)):
                    ch = s[i]
                    for j in range(26):
                        s[i] = chr(ord('a') + j)
                        t = ''.join(s)
                        if dist.get(t, 0) == step:
                            prev[t].add(p)
                        if t not in words:
                            continue
                        prev[t].add(p)
                        words.discard(t)
                        q.append(t)
                        dist[t] = step
                        if endWord == t:
                            found = True
                    s[i] = ch
        if found:
            path = [endWord]
            dfs(path, endWord)
        return ans
speed

复杂度分析

指标
时间complexity depends on the number of words and the branching factor at each word, with BFS and backtracking combined to explore all shortest sequences, leading to worst-case exponential growth relative to sequence length. Space complexity accounts for the BFS queue, hash tables for word lookups, and recursion stacks in backtracking, making both time and space dependent on the number of words and sequences generated, as outlined in the provided approach.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Do you handle cycles and repeated words to avoid redundant paths in backtracking?

  • question_mark

    Can you optimize neighbor lookups using hash tables to reduce time complexity?

  • question_mark

    Will you ensure that all returned sequences are the minimal length possible?

warning

常见陷阱

外企场景
  • error

    Failing to prune paths not on the shortest sequence, leading to TLE or incorrect extra sequences.

  • error

    Revisiting words within the same transformation path, causing cycles or duplicate sequences.

  • error

    Ignoring BFS distance levels in backtracking, which can include longer-than-necessary transformations.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Return only the count of distinct shortest transformation sequences instead of the sequences themselves.

  • arrow_right_alt

    Modify the problem to allow transformations that change up to two characters at a time, adjusting BFS and backtracking logic.

  • arrow_right_alt

    Find the shortest transformation path from beginWord to endWord while allowing intermediate words that are not in wordList if necessary.

help

常见问题

外企场景

单词接龙 II题解:回溯·pruning | LeetCode #126 困难