class Solution {
public:
vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {
vector<vector<string> > ret;
unordered_set<string> wordSet(cbegin(wordList), cend(wordList));
using SVUMAP = unordered_map<string, vector<vector<string> > >;
SVUMAP beginMap{ make_pair(beginWord, vector<vector<string> > {vector<string>{ beginWord } }) };
wordSet.erase(beginWord);
if (wordSet.find(endWord) == wordSet.end()) return vector<vector<string> > ();
SVUMAP endMap{ make_pair(endWord, vector<vector<string> > { vector<string> { endWord } }) };
wordSet.erase(endWord);
SVUMAP *pBMap = &beginMap;
SVUMAP *pEMap = &endMap;
bool beginToEnd = true;
while (!(*pBMap).empty() && !(*pEMap).empty() && ret.empty()) {
if ((*pEMap).size() < (*pBMap).size()) {
swap(pBMap, pEMap);
beginToEnd = !beginToEnd;
}
SVUMAP nextMap;
for (auto mp : (*pBMap)) {
string wd = get<0>(mp);
vector<vector<string> > bvv = get<1>(mp);
for (int i = 0; i != beginWord.size(); ++i) {
char c = wd[i];
for (char j = 'a'; j <= 'z'; ++j) {
wd[i] = j;
if ((*pEMap).find(wd) != (*pEMap).end()) { // 已经找到最短的了,但是在同及中还需要再找
vector<vector<string> > evv = (*pEMap)[wd];
if (beginToEnd) {
for (auto bv : bvv) {
for (auto ev : evv) {
vector<string> tmp(bv);
copy(crbegin(ev), crend(ev), back_inserter(tmp));
ret.emplace_back(move(tmp));
}
}
} else {
for (auto bv : bvv) {
for (auto ev : evv) {
vector<string> tmp(ev);
copy(crbegin(bv), crend(bv), back_inserter(tmp));
ret.emplace_back(move(tmp));
}
}
}
continue;
}
if (ret.empty()) { // 所有的答案是等长的
if (wordSet.find(wd) == end(wordSet)) continue;
for (auto bv : bvv) {
vector<string> tmp(bv);
tmp.emplace_back(wd);
nextMap[wd].emplace_back(tmp);
}
}
}
wd[i] = c;
}
}
for (auto mp : nextMap) {
wordSet.erase(get<0>(mp));
}
(*pBMap) = nextMap;
}
return ret;
}
};
Leetcode 126 word ladder II
最新推荐文章于 2021-02-19 03:15:06 发布