Transform beginWord into endWord by changing one letter at a time, where every intermediate word must be in wordList. Return the number of words in the shortest such sequence, or 0 if none exists.
Grow one frontier from each end and always expand the smaller one. The search ends when a generated word lies in the other frontier. This explores far fewer words when branching is large.
1function ladderLength(beginWord: string, endWord: string, wordList: string[]): number {2const dict = new Set(wordList);3if (!dict.has(endWord)) return 0;4let front = new Set([beginWord]), back = new Set([endWord]), steps = 1;5dict.delete(endWord);6while (front.size && back.size) {7if (front.size > back.size) [front, back] = [back, front];8const next = new Set<string>();9for (const w of front)10for (let i = 0; i < w.length; i++)11for (const c of "abcdefghijklmnopqrstuvwxyz") {12const v = w.slice(0, i) + c + w.slice(i + 1);13if (back.has(v)) return steps + 1;14if (dict.delete(v)) next.add(v);15}16front = next; steps++;17}18return 0;19}
One frontier from each end.
Space: play/pause · ←/→: step