1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class Solution { public: vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) { unordered_map<string, int> d; for (const auto &u : wordList) { d[u] = INT_MAX; }
unordered_map<string, vector<string>> next; queue<string> q; q.push(beginWord); d[beginWord] = 0; while (!q.empty()) { auto u = q.front(); q.pop(); if (u == endWord) break; auto v = u; for (auto &&c : v) { auto t = c; for (char x = 'a'; x <= 'z'; ++x) { c = x; if (x == t || d.count(v) == 0 || d[v] < d[u] + 1) continue; if (d[v] > d[u] + 1) { d[v] = d[u] + 1; q.push(v); } next[u].push_back(v); } c = t; } }
vector<string> v; vector<vector<string>> res; v.push_back(beginWord); dfs(beginWord, endWord, next, v, res); return res; }
void dfs(const string &w, const string &e, unordered_map<string, vector<string>> &next, vector<string> &v, vector<vector<string>> &res) { if (w == e) { res.push_back(v); return; } for (const auto &n : next[w]) { v.push_back(n); dfs(n, e, next, v, res); v.pop_back(); } } };
|