1. word ladder
1 class Solution 2 { 3 public: 4 int ladderLength(string beginWord, string endWord, unordered_set<string> &wordDict) 5 { 6 queue<string> q; 7 q.push(beginWord); 8 unordered_map<string, int> umap; 9 umap[beginWord] = 1; 10 for (q.push(beginWord); !q.empty(); q.pop()) 11 {//这里用for的好处是这本身是一个模块化的过程:先入队;当队非空时进行循环,同时每个循环结束时都要把当前元素出队。用for不容易遗漏q.pop()。 12 string word = q.front(); 13 int step = umap[word] + 1; 14 for (int i = 0; i<word.size(); i++) 15 { 16 for (char c = 'a'; c <= 'z'; c++) 17 { 18 if (word[i] != c) 19 { 20 char tmp = word[i]; 21 word[i] = c; 22 if (word == endWord)//this line should here, not in the if statement below,coz endWord may not be in dict 23 return step; 24 if (wordDict.find(word) != wordDict.end() && umap.find(word) == umap.end()) 25 { 26 umap[word] = step; 27 q.push(word); 28 } 29 word[i] = tmp;//don't forget to restore 30 } 31 } 32 } 33 } 34 return 0; 35 } 36 };