---
# System prepended metadata

title: 'LeetCode #127 [Word Ladder](https://leetcode.com/problems/word-ladder/)'
tags: [LeetCode, String, Hard, BFS, Queue]

---

###### tags: `LeetCode` `BFS` `Hard` `String` `Queue`
# LeetCode #127 [Word Ladder](https://leetcode.com/problems/word-ladder/)
### (Hard)

字典 wordList 中從單詞 beginWord 和 endWord 的 轉換序列 是一個按下述規格形成的序列：

* 序列中第一個單詞是 beginWord 。
* 序列中最後一個單詞是 endWord 。
* 每次轉換只能改變一個字母。
* 轉換過程中的中間單詞必須是字典 wordList 中的單詞。

給你兩個單詞 beginWord 和 endWord 和一個字典 wordList ，找到從 beginWord 到 endWord 的 最短轉換序列 中的 單詞數目 。如果不存在這樣的轉換序列，返回 0。

---
先用unordered_set dict儲存wordList, 消除重複字串。

使用Queue, 先存入起始字串, 並把單詞數目設為1。

讀取Queue的第一個字串, 將其從dict裡刪除, 並針對每一個字元進行a到z的替換, 並確認dict是否存在替換後的字串, 若是, 則將其push到佇列中, 這些是現在字串在替換一個字元後可變成的字串, 在每一輪結束後, 將單詞數目+1。

如此循環直到替換的字串等同於endWord, 此時回傳單詞數目(beginWord需轉換幾次才能變成endWord)。

注意, 替換字元( word[i] )後須將字串回復成原本的樣子, 再進行下一個字元( word[i+1] )的替換。

( Queue常用於BFS搜尋? )

---
```
class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> dict(wordList.begin(), wordList.end());
        queue<string> todo;
        todo.push(beginWord);
        int ladder = 1;
        while(!todo.empty()){
            for (int i = todo.size();i>0;i--){
                string word = todo.front();todo.pop();
                if(word==endWord)return ladder;
                dict.erase(word);
                for(int j=0;j<word.size();j++){
                    char c= word[j];
                    for(int k=0;k<26;k++){
                        word[j]='a' + k;
                        if(dict.find(word)!=dict.end())todo.push(word);
                    }
                    word[j]=c;
                }
            }
            ladder++;
        }
        return 0;
    }
};
```