BFS+DFS
class Solution {
public:
map<string,unordered_set<string>> buildTree(
string beginWord,
string endWord,
unordered_set<string> &wordList)
{
map<string,unordered_set<string>> parent;
wordList.insert(beginWord);
wordList.insert(endWord);
unordered_set<string> level[3];
unordered_set<string> *curLevel=&level[0];
unordered_set<string> *preLevel=&level[1];
unordered_set<string> *newLevel=&level[2];
int i,j;
bool canRch=false;
curLevel->insert(beginWord);
while (!canRch)
{
for(auto it=curLevel->begin();it!=curLevel->end();it++)
{
for(i=0;i<(*it).size();i++)
{
for(j='a';j<='z';j++)
{
string tmp=*it;
tmp[i]=j;
if(tmp==endWord)
{
canRch=true;
parent[*it].insert(tmp);
continue;
}
if(wordList.find(tmp)==wordList.end()||curLevel->count(tmp)>0||preLevel->count(tmp)>0)
continue;
newLevel->insert(tmp);
parent[*it].insert(tmp);
}
}
}
if(newLevel->size()==0)
break;
unordered_set<string> *p=preLevel;
preLevel=curLevel;
curLevel=newLevel;
newLevel=p;
p->clear();
}
if(!canRch)
{
parent.clear();
return parent;
}
return parent;
}
void GetPath(
string beginWord,
string endWord,
map<string,unordered_set<string>>& parent,
vector<vector<string>>& paths,
vector<string>& path)
{
if(path.back()==endWord)
{
paths.push_back(path);
return;
}
unordered_set<string> st;
st=parent[beginWord];
for(auto it=st.begin();it!=st.end();it++)
{
path.push_back(*it);
GetPath(*it,endWord,parent,paths,path);
path.pop_back();
}
}
vector<vector<string>> findLadders(string beginWord, string endWord, unordered_set<string> &wordList) {
vector<vector<string>> Ladders;
vector<vector<string>> Paths;
vector<string> Ladder;
if(beginWord==endWord)
{
Ladder.push_back(beginWord);
Ladder.push_back(endWord);
Ladders.push_back(Ladder);
return Ladders;
}
map<string,unordered_set<string>> parent=buildTree(beginWord,endWord,wordList);
Ladder.push_back(beginWord);
GetPath(beginWord,endWord,parent,Ladders,Ladder);
return Ladders;
}
};