Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2015
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
  4.         unordered_map<string, unordered_set<string>> prevMap;
  5.         vector<vector<string>> solutions;
  6.         deque<string> q[2];
  7.         bool done=false;
  8.         int current=0;
  9.         int next=1;
  10.         q[current].push_back(start);
  11.         while(!q[current].empty()){
  12.             string c=q[current].front();
  13.             q[current].pop_front();
  14.             string prev=c;
  15.             for(int i=0;i<c.size();i++)
  16.                 for(int k='a';k<='z';k++){
  17.                     if(c[i]!=k){
  18.                         char beforeChange=c[i];
  19.                         c[i]=k;
  20.                         if(c==end) {
  21.                             prevMap[end].insert(prev); // in case end can be not in dict
  22.                             done=true;
  23.                         } else if(dict.find(c)!=dict.end()){
  24.                             if(prevMap.find(c)==prevMap.end()){
  25.                                 q[next].push_back(c);
  26.                             }
  27.                             prevMap[c].insert(prev);
  28.                         }
  29.                         c[i]=beforeChange;
  30.                     }
  31.                 }
  32.  
  33.             for(auto s: q[next]){
  34.                 dict.erase(s);
  35.             }
  36.             if(q[current].empty()) {
  37.                 if(done) break;
  38.                 current=next;
  39.                 next=!current;
  40.             }
  41.         }
  42.        
  43.         if(done){
  44.             deque<string> res;
  45.             res.push_back(end);
  46.             printPrevRec(res, start, prevMap, solutions);
  47.         }
  48.         return solutions;
  49.     }
  50.    
  51.     void printPrevRec(deque<string>& res, string& start, unordered_map<string, unordered_set<string>>& pmap, vector<vector<string>>& solutions){
  52.         for(auto e: pmap[res.back()]){
  53.             res.push_back(e);
  54.             if(e==start){
  55.                 vector<string> res1;
  56.                 for(auto it=res.rbegin(); it!=res.rend(); it++) {
  57.                     res1.push_back(*it);
  58.                 }
  59.                 solutions.push_back(res1);
  60.             } else {
  61.                 printPrevRec(res, start, pmap, solutions);
  62.             }
  63.             res.pop_back();
  64.         }
  65.     }
  66. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement