class Solution { public: vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) { unordered_set<string> s(wordList.begin(), wordList.end()); vector<vector<string>> res; if (s.find(endWord) == s.end() || beginWord == endWord) return res; queue<vector<string>> q; q.push({beginWord}); s.erase(beginWord); while (!q.empty()) { int qs = q.size(); unordered_set<string> curLvWords; while (qs-- > 0) { vector<string> cur = q.front(); beginWord = cur.back(); q.pop(); bool foundInCurrentWord = false; for (int i = 0; i < beginWord.length(); i++) { string newWord = beginWord; for (char c = 'a'; c <= 'z'; c++) { newWord[i] = c; if (s.find(newWord) == s.end()) continue; curLvWords.insert(newWord); vector<string> t = cur; t.push_back(newWord); if (newWord == endWord) { foundInCurrentWord = true; res.push_back(t); } q.push(t); } if (foundInCurrentWord) { break; } } } if (curLvWords.find(endWord) != curLvWords.end()) { break; } for (auto & w : curLvWords) s.erase(w); } return res; } };