예제 #1
0
 //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;        
 }
예제 #2
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;
    }