127. Word Ladder
題目網址:https://leetcode.cn/problems/word-ladder/
題意:一個 transform sequence 指的是
wordList中從單字beginWord到endWord的 sequencebeginWord -> s1 -> s2 -> ... -> sk, 且 transform sequence 需滿足以下條件:
- 相鄰的兩個單字只差一個字母
- 每個
si都在wordList中, 其中1 ≤ i ≤ k。注意,beginWord不需在wordList中sk == endWord給兩個單字
beginWord和endWord, 以及一字典wordList, 返回從beginWord到endWord的最短 transform sequence 中的單字個數。若不存在這樣的 transform sequence, 則返回0。注意:
wordList[i]僅由小寫字母所組成。

Solution 1:
想法:看到最短路徑會直覺想到 Dijkstra, 但在 unweighted graph 中, 其實只需要用 BFS 就可求得最短路徑了。故利用 BFS, 從 queue
q中取出當前的 wordcurWord, 然後將每個curWord[i]替換成a - z的其他 char。若更改後的curWord存在於dict中, 則將其加到q中, 並將其從dict中刪除以避免下一輪中q重複添加e.g.
hit -> hot -> hit
class Solution { |
- time:$O(n \cdot len)$ ➔ $O(n \cdot 26 \cdot len)$, 其中
n為 word 的個數,len為每個 word 的長度- $O(n)$:每一輪最少要從
wordList中取一個 word, 故最多有n輪, 總共最多取n個 word - $O(26 \cdot len)$:每個 word 可產生 $26 * len$ 個單字
- $O(n)$:每一輪最少要從
- space:$O(n \cdot len)$ ➔
dict儲存每個 word
Solution 2:
想法:利用 Bidirectional BFS(雙向 BFS), 從
beginWord和endWord兩端開始拓展, 兩端產生的 word 分別用s1、s2儲存, 讓s1永遠為較小的 hash set, 這樣 for loop 進行拓展的 word 會比較少。一旦s1的 word 所拓展出來的 new word 出現在s2中, 代表兩端碰頭, 故返回res + 1
e.g.
wordList = ["hot","dot","dog","lot","log","cog"],begin = "hit",end = "cog"
- 一開始,
s1 = {hit},s2 = {cog}- 第一輪,
s1拓展 ➔s1 = {hit, hot},s2 = {cog}- 第二輪
s1和s2先 swap ➔s1 = {cog},s2 = {hit, hot}s1拓展 ➔s1 = {cog, dog, log},s2 = {hit, hot}- 第三輪
s1和s2先 swap ➔s1 = {hit, hot},s2 = {cog, dog, log}s1拓展 ➔s1 = {hit, hot, dot, lot},s2 = {cog, dog, log}- 第四輪
s1和s2先 swap ➔s1 = {cog, dog, log},s2 = {hit, hot, dot, lot}s1拓展 ➔s1 = {cog, dog, log, dot}, 發現dot已出現在s2中, 故中止
class Solution { |
- time:$O(n \cdot len)$ ➔ $O(n \cdot 26 \cdot len)$, 其中
n為 word 的個數,len為每個 word 的長度- $O(n)$:每一輪最少要從
wordList中取一個 word, 故最多有n輪, 總共最多取n個 word - $O(26 \cdot len)$:每個 word 可產生 $26 * len$ 個單字
- $O(n)$:每一輪最少要從
- space:$O(n \cdot len)$ ➔
dict儲存每個 word

