###### 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;
}
};
```