Advertisement
Guest User

Untitled

a guest
Mar 29th, 2015
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 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(!done){
  12.             while(!q[current].empty()){
  13.                 auto c=q[current].front();
  14.                 q[current].pop_front();
  15.                 string prev=c;
  16.                 for(int i=0;i<c.size();i++)
  17.                     for(int k='a';k<='z';k++){
  18.                         if(c[i]!=k){
  19.                             char beforeChange=c[i];
  20.                             c[i]=k;
  21.                             if(c==end || dict.empty()) done=true;
  22.                             if(dict.find(c)!=dict.end()){
  23.                                 if(prevMap.find(c)==prevMap.end()){
  24.                                     q[next].push_back(c);
  25.                                 }
  26.                                 prevMap[c].insert(prev);
  27.                             }
  28.                             c[i]=beforeChange;
  29.                         }
  30.                     }
  31.  
  32.                 for(auto s: q[next]){
  33.                     dict.erase(s);
  34.                 }
  35.             }
  36.             if(done) break;
  37.             current=next;
  38.             next=!current;
  39.         }
  40.        
  41.         if(done){
  42.             vector<string>res;
  43.             res.push_back(end);
  44.             printPrevRec(res, start, prevMap, solutions);
  45.         }
  46.         return solutions;
  47.     }
  48.    
  49.     void printPrevRec(vector<string>& res, string& start, unordered_map<string, unordered_set<string>>& pmap, vector<vector<string>>& solutions){
  50.         for(auto e: pmap[res.back()]){
  51.             res.push_back(e);
  52.             if(e==start){
  53.                 solutions.push_back(res);
  54.             } else {
  55.                 printPrevRec(res, start, pmap, solutions);
  56.             }
  57.             res.pop_back();
  58.         }
  59.     }
  60. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement