Word Ladder

一开始的做法是构造一个map记录每个单词是否访问过,然后从第一个单词进行广搜,如果相差一个字母并且没有访问过,则添加到队列中。这样的坏处是每次都要遍历一遍dict表,结果超时。后来参考别人的代码,对原始单词进行修改,然后查看是否在dict中,这样做没有超时

class Solution {
public:
    struct Node{
        string word;
        int num;
        Node():num(0){}
    };
    queue<Node> q;
    unordered_set<string> del;
    int ladderLength(string start, string end, unordered_set<string> &dict) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(start==end) return 1;
        if(dif(start,end)==1) return 2;
        while(!q.empty()) q.pop();
        del.clear();
        Node a;
        a.word=start;
        q.push(a);
        int res=-1;
        del.insert(start);
        while(!q.empty()){
            Node tmp=q.front();q.pop();
            if(tmp.word==end) {res=tmp.num;break;}
            int length=tmp.word.length();
            for(int i=0;i<length;i++)
                for(int j=0;j<26;j++){
                    string str=tmp.word;
                    str[i]='a'+j;
                    if(str!=tmp.word&&dict.find(str)!=dict.end()&&del.find(str)==del.end()){
                        Node nd;
                        nd.word=str;
                        nd.num=tmp.num+1;
                        q.push(nd);
                        del.insert(str);//刚才看来是少了这一句啊
                    }
                }
        }
        return res+1;
    }
    int dif(string a,string b){
        int i,j,len=a.length();
        int res=0;
        for(i=0;i<len;i++)
            if(a[i]==b[i]) res++;
        return len-res;
    }
};


你可能感兴趣的:(Word Ladder)