Word Ladder II

来源:互联网 发布:ubuntu 用户组 编辑:程序博客网 时间:2024/05/17 17:59

pass the small case

large case TLE

 

class Solution {    vector<string> findNeighbors(unordered_set<string> &dict,string s,unordered_map<string,char> &visited,char s_e,bool &collision){        vector<string> vec;        for(int i=0;i<s.length();++i){            for(char c='a';c<='z';++c){                string str=s;                if(str[i]!=c){                    str[i]=c;                    if(dict.find(str)!=dict.end()&&!(visited[str]&(s_e<<2))){//                        vec.push_back(str);                        if(visited[str]&s_e){                            visited[str]|(s_e<<2);                        }else                            visited[str]|=s_e;                        if((visited[str]&3)==3)collision=true;                    }                }            }        }        return vec;    }public:    vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        vector<vector<string> > tmp,ret;        vector<string> start_list,end_list;        vector<string> vec_start,vec_end,vec_tmp1,vec_tmp2,vec_tmp;        queue<vector<string> > start_que,end_que,new_sque,new_eque;        start_que.push(vector<string>(1,start));        end_que.push(vector<string>(1,end));        unordered_map<string,char> visited;        visited[start]=1;        visited[end]=2;        while(!start_que.empty()&&!end_que.empty()){            bool collision=false;            queue<vector<string> > new_sq ;                        while(!start_que.empty()){                vec_start = start_que.front();                start_que.pop();                  start_list=findNeighbors(dict,vec_start[vec_start.size()-1],visited,1,collision);                for(int i=0;i<start_list.size();++i){                    vec_start.push_back(start_list[i]);                    new_sq.push(vec_start);                    vec_start.pop_back();                }            }            if(collision){                new_sque=new_sq;                new_eque=end_que;                break;            }            queue<vector<string> > new_eq ;            while(!end_que.empty()){                vec_end   = end_que.front();                end_que.pop();                end_list=findNeighbors(dict,vec_end[vec_end.size()-1],visited,2,collision);                for(int i=0;i<end_list.size();++i){                    vec_end.push_back(end_list[i]);                    new_eq.push(vec_end);                    vec_end.pop_back();                }            }            if(collision){                new_sque=new_sq;                new_eque=new_eq;                break;            }            start_que=new_sq;            end_que=new_eq;        }        while(!new_sque.empty()){            tmp.push_back(new_sque.front());            new_sque.pop();        }        while(!new_eque.empty()){            vec_tmp1=new_eque.front();            string laststr_s=vec_tmp1[vec_tmp1.size()-1];            new_eque.pop();            if((visited[laststr_s]&3)==3){                for(int i=0;i<tmp.size();++i){                    vec_tmp2=tmp[i];                    string laststr_e=vec_tmp2[vec_tmp2.size()-1];                    if(laststr_s==laststr_e){                        vec_tmp=vec_tmp2;                        vec_tmp.pop_back();                        vec_tmp.insert(vec_tmp.end(),vec_tmp1.rbegin(),vec_tmp1.rend());                        ret.push_back(vec_tmp);                    }                }            }        }        return ret;    }};



 

原创粉丝点击