Algorithms first

单词接龙 · 交互式算法学习

每次改变一个字母,求到目标单词的最短转换序列长度。

#127 · 图的广度优先搜索

单词接龙

Word Ladder

测试用例beginWord = hit, endWord = cog, wordList = [hot,dot,dog,lot,log,cog]
树 / 图3 个关键状态
步骤 1前沿为 {hit} 与 {cog}。distance=1
hithotdotdogcog
推荐

双向 BFS

时间 O(N·L·26)空间 O(N)

从 begin 与 end 两端扩展较小前沿,显著减少搜索层宽。

1function ladderLength(begin, end, words) {2  const set = new Set(words);3  if (!set.has(end)) return 0;4  let a = new Set([begin]),5    b = new Set([end]),6    d = 1;7  while (a.size && b.size) {8    if (a.size > b.size)[a, b] = [b, a];9    const next = new Set();10    for (const w of a)11      for (let i = 0; i < w.length; i++)12        for (const c of 'abcdefghijklmnopqrstuvwxyz') {13          const n = w.slice(0, i) + c + w.slice(i + 1);14          if (b.has(n)) return d + 1;15          if (set.delete(n)) next.add(n)16        }17    a = next;18    d++;19  }20  return 0;21}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    public int ladderLength(String beginWord, String endWord, List<String> wordList) {3        Set<String> words = new HashSet<>(wordList);4        Queue<String> q = new ArrayDeque<>();5        q.offer(beginWord);6        int ans = 1;7        while (!q.isEmpty()) {8            ++ans;9            for (int i = q.size(); i > 0; --i) {10                String s = q.poll();11                char[] chars = s.toCharArray();12                for (int j = 0; j < chars.length; ++j) {13                    char ch = chars[j];14                    for (char k = 'a'; k <= 'z'; ++k) {15                        chars[j] = k;16                        String t = new String(chars);17                        if (!words.contains(t)) {18                            continue;19                        }20                        if (endWord.equals(t)) {21                            return ans;22                        }23                        q.offer(t);24                        words.remove(t);25                    }26                    chars[j] = ch;27                }28            }29        }30        return 0;31    }32}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

单词接龙 · 解法对比

每次改变一个字母,求到目标单词的最短转换序列长度。

测试用例
beginWord = hit, endWord = cog, wordList = [hot,dot,dog,lot,log,cog]
题目分类
图的广度优先搜索
解法对比
2
方案 1

单向 BFS 枚举字符

每层生成一字母不同的所有候选,词表内未访问单词入队。

时间
O(N·L·26)
空间
O(N)
方案 2

双向 BFS

从 begin 与 end 两端扩展较小前沿,显著减少搜索层宽。

时间
O(N·L·26)
空间
O(N)