//double bfs: search from both start and end int ladderLength(string start, string end, unordered_set<string> &dict) { if (valid(start,end)){return 2;} struct node{ string str; int lev; node(string s,int l):str(s),lev(l){} }; queue<node>q; queue<node>rq; map<string,bool>mark; map<string,bool>rmark; for (auto it=dict.begin();it!=dict.end();it++){ mark[*it]=false; rmark[*it]=false; } int level=1; int rlevel=1; q.push(node(start,1)); rq.push(node(end,1)); while (!q.empty() && !rq.empty()){ if (q.size()<rq.size()){ while (!q.empty() && q.front().lev==level){ vector<string> l = findDict(q.front().str,dict); for (auto it=l.begin();it!=l.end();it++){ if (!mark[*it]){ mark[*it]=true; if (rmark[*it]){return q.front().lev+rq.back().lev;} q.push(node(*it,level+1)); } } q.pop(); } level++; }else{ while (!rq.empty() && rq.front().lev==rlevel){ vector<string> lr = findDict(rq.front().str,dict); for (auto it=lr.begin();it!=lr.end();it++){ if (!rmark[*it]){ rmark[*it]=true; if (mark[*it]){return rq.front().lev+q.back().lev;} rq.push(node(*it,rlevel+1)); } } rq.pop(); } rlevel++; } } return 0; }
int ladderLength(string start, string end, unordered_set<string> &dict) { // Note: The Solution object is instantiated only once and is reused by each test case. if (valid(start, end)) return 2; queue<node> q; queue<node> rq; map<string, bool> mark; map<string, bool> rmark; for(auto it=dict.begin(); it!= dict.end(); it++){ mark[*it] = false; rmark[*it] = false; } int level = 1; int rlevel = 1; q.push(node(start,1)); rq.push(node(end,1)); while(!q.empty() & !rq.empty()){ if (q.size()<rq.size()){ while (!q.empty() && q.front().lev==level){ vector<string> l = findDict(q.front().str,dict); for (auto it=l.begin();it!=l.end();it++){ if (!mark[*it]){ mark[*it]=true; if (rmark[*it]){return q.front().lev+rq.back().lev;} q.push(node(*it,level+1)); } } q.pop(); } level++; }else{ while (!rq.empty() && rq.front().lev==rlevel){ vector<string> lr = findDict(rq.front().str,dict); for (auto it=lr.begin();it!=lr.end();it++){ if (!rmark[*it]){ rmark[*it]=true; if (mark[*it]){return rq.front().lev+q.back().lev;} rq.push(node(*it,rlevel+1)); } } rq.pop(); } rlevel++; } } return 0; }