You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的BFS算法无法返回单词接龙的预期最短路径?

单词接龙最短路径BFS实现指南

看起来你已经找对方向啦——BFS(广度优先搜索)确实是解决这类最短路径问题的最优选择,因为它是按层级遍历的,第一次遇到目标单词时的层级就是最短路径长度。下面我来帮你把思路补全,再结合你的测试用例详细拆解:

核心思路

BFS的核心是按“层”处理所有可能的单词转换:每一层对应路径长度的递增,一旦在某一层找到endWord,当前的路径长度就是答案。同时我们需要避免重复处理同一个单词(防止循环),还要优化单词存在性的查询效率。

具体实现步骤

  • 先把wordList转换成集合:集合的查找时间复杂度是O(1),比列表的O(n)高效太多,能大幅提升算法速度。
  • 初始化队列:每个队列元素要包含两个信息——当前单词和当前路径长度,比如初始队列是[("hit", 1)](路径长度从1开始,因为起始单词本身算一个节点)。
  • 维护已访问集合:记录已经处理过的单词,避免重复入队造成循环。
  • 循环处理队列:
    • 取出队首的单词和路径长度,如果当前单词就是endWord,直接返回路径长度。
    • 遍历当前单词的每个字符位置,把每个位置依次替换成a-z的所有字母,生成新单词。
    • 检查新单词是否在wordList集合中且未被访问过,如果是,就将其加入队列(路径长度+1),同时标记为已访问。

针对你的测试用例走查

测试用例:beginWord = "hit",endWord = "cog",wordList = ["hot","dot","dog","lot","log","cog"]
预期输出:5,对应路径hit -> hot -> dot -> dog -> cog

  1. 初始队列:[("hit", 1)],已访问集合:{"hit"}
  2. 处理hit:生成所有单字符替换的单词,其中hot在wordList中,加入队列,路径长度变为2,队列变为[("hot", 2)]
  3. 处理hot:生成dot、lot等有效单词,加入队列,路径长度3,队列变为[("dot", 3), ("lot", 3)]
  4. 处理dot:生成dog加入队列(路径4);处理lot生成log加入队列(路径4)
  5. 处理dog:生成cog,正好是endWord,此时路径长度为5,直接返回结果。

代码示例(Python)

from collections import deque

def ladderLength(beginWord, endWord, wordList):
    word_set = set(wordList)
    # 提前判断目标词是否在列表中,避免无效遍历
    if endWord not in word_set:
        return 0
    
    visited = set()
    queue = deque()
    queue.append((beginWord, 1))
    visited.add(beginWord)
    
    while queue:
        current_word, path_length = queue.popleft()
        
        # 找到目标词,直接返回当前路径长度
        if current_word == endWord:
            return path_length
        
        # 遍历单词的每个字符位置
        for i in range(len(current_word)):
            # 尝试替换为a-z的每个字母
            for c in 'abcdefghijklmnopqrstuvwxyz':
                if c == current_word[i]:
                    continue  # 跳过和原字符相同的情况,避免无效生成
                new_word = current_word[:i] + c + current_word[i+1:]
                # 检查新单词是否有效且未被访问
                if new_word in word_set and new_word not in visited:
                    visited.add(new_word)
                    queue.append((new_word, path_length + 1))
    
    # 遍历完所有可能仍未找到路径,返回0
    return 0

# 测试你的用例
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log","cog"]
print(ladderLength(beginWord, endWord, wordList))  # 输出5

优化小技巧

如果你的wordList规模很大,可以试试双向BFS:同时从beginWord和endWord两边开始遍历,当两边的遍历集合相遇时,将两边的路径长度相加就是最短路径。这种方式能大幅减少需要遍历的节点数量,提升效率。

内容的提问来源于stack exchange,提问作者Uthman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:33:49