您的位置:首页 > 其它

Leetcode 126 word ladder II

2018-02-03 21:13 337 查看
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: