int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) { if (beginWord == endWord) return 1; unordered_set<string> words1, words2; words1.insert(beginWord); words2.insert(endWord); wordList.erase(beginWord); wordList.erase(endWord); return ladderLengthHelper(words1, words2, wordList, 1); }
int ladderLengthHelper(vector<pair<string, int> >& start, vector<pair<string, int> >& end, unordered_set<string>& wordDict, unordered_map<string, bool>& sm, unordered_map<string, bool>& em) { if (start.size() > end.size()) return ladderLengthHelper(end, start, wordDict, em, sm); if (start.size() == 0) return 0; int size = start.size(); for (int i = 0; i < size; i++) wordDict.erase(start[i].first); for (int i = 0; i < size; i++) { pair<string, int> cur = start.front(); start.erase(start.begin()); vector<string> strSet = findStrSet(cur.first, wordDict); for (int j = 0; j < strSet.size(); j++) { if (em[strSet[j]]) return cur.second + end.back().second; sm[strSet[j]] = true; start.push_back(make_pair(strSet[j], cur.second + 1)); } } return ladderLengthHelper(start, end, wordDict, sm, em); }
int ladderLengthHelper(unordered_set<string>& words1, unordered_set<string>& words2, unordered_set<string>& dict, int level) { if (words1.empty()) return 0; if (words1.size() > words2.size()) { return ladderLengthHelper(words2, words1, dict, level); } unordered_set<string> words3; for (auto it = words1.begin(); it != words1.end(); ++it) { string word = *it; for (char& c : word) { char tmp = c; for (c = 'a'; c <= 'z'; ++(c)) { if (words2.find(word) != words2.end()) return level + 1; else if (dict.find(word) != dict.end()) { dict.erase(word); words3.insert(word); } } c = tmp; } } return ladderLengthHelper(words2, words3, dict, level + 1); }
int ladderLength(string beginWord, string endWord, unordered_set<string>& wordDict) { if (beginWord == endWord) return 1; wordDict.insert(beginWord); wordDict.insert(endWord); unordered_map<string, bool> sm; unordered_map<string, bool> em; for (auto it = wordDict.begin(); it != wordDict.end(); it++) { sm[*it] = false; em[*it] = false; } sm[beginWord] = true; em[endWord] = true; vector<pair<string, int> > start; vector<pair<string, int> > end; start.push_back(make_pair(beginWord, 1)); end.push_back(make_pair(endWord, 1)); return ladderLengthHelper(start, end, wordDict, sm, em); }