Algorithms first
单词接龙 · 交互式算法学习
每次改变一个字母,求到目标单词的最短转换序列长度。
#127 · 图的广度优先搜索
单词接龙
Word Ladder
beginWord = hit, endWord = cog, wordList = [hot,dot,dog,lot,log,cog]树 / 图3 个关键状态
步骤 1前沿为 {hit} 与 {cog}。
distance=1推荐
双向 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}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
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 同题参考实现。
AlgoViz Lab
单词接龙 · 解法对比
每次改变一个字母,求到目标单词的最短转换序列长度。
- 测试用例
beginWord = hit, endWord = cog, wordList = [hot,dot,dog,lot,log,cog]- 题目分类
- 图的广度优先搜索
- 解法对比
- 2
单向 BFS 枚举字符
每层生成一字母不同的所有候选,词表内未访问单词入队。
- 时间
O(N·L·26)- 空间
O(N)
双向 BFS
从 begin 与 end 两端扩展较小前沿,显著减少搜索层宽。
- 时间
O(N·L·26)- 空间
O(N)