leetcode日题 127. 单词接龙

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        //优化,双向BFS
        //优先遍历两个队列中size较小的
        queue<string> open1;
        queue<string> open2;
        unordered_set<string> close1;
        unordered_set<string> close2;
        unordered_set<string> worddit(wordList.begin(),wordList.end());
        //这里的集合用于更改状态
        int depth1=0;
        if(!worddit.count(endWord)){
            return 0;
        }
        //双向BFS需要判断起点是否为终点
        int test=0;
        for(int i=0;i<beginWord.size();i++){
            if(beginWord[i]!=endWord[i]){
                test++;
            }
        }
        if(test==1){
            return 2;
        }
        open1.push(beginWord);
        open2.push(endWord);
        string cur;
        while(!open1.empty()&&!open2.empty()){
            if(open1.size()>open2.size()){
                queue<string> temp1=open1;
                open1=open2;
                open2=temp1;
                unordered_set<string> temp2=close1;
                close1=close2;
                close2=temp2;
            }
            int n1=open1.size();
            //这里必须要逐层遍历,不然深度的增加会出错
            while(n1--){
                cur=open1.front();
                open1.pop();
                //改用 逐个字母修改
                if(close2.count(cur)){
                    return depth1;
                }
                if(close1.count(cur)){
                    continue;
                }
                close1.insert(cur);
                for(auto& cbyte:cur){
                    for(char i='a';i<='z';i++){
                        char temp=cbyte;
                        cbyte=i;
                        if(worddit.count(cur)&&temp!=i){
                            open1.push(cur);
                        }
                        cbyte=temp;
                    }
                }
            }
            depth1++;
            
        }
        return 0;

        // //双向BFS
        // queue<string> open1;
        // queue<string> open2;
        // unordered_set<string> close1;
        // unordered_set<string> close2;
        // unordered_set<string> worddit(wordList.begin(),wordList.end());
        // //也可以用close表,这里用集合代替,访问过的单词会被擦除
        // int depth1=0;
        // int depth2=0;
        // if(!worddit.count(endWord)){
        //     return 0;
        // }
        // //双向BFS需要判断起点是否为终点
        // int test=0;
        // for(int i=0;i<beginWord.size();i++){
        //     if(beginWord[i]!=endWord[i]){
        //         test++;
        //     }
        // }
        // if(test==1){
        //     return 2;
        // }
        // open1.push(beginWord);
        // open2.push(endWord);
        // string cur;
        // while(!open1.empty()&&!open2.empty()){
        //     int n1=open1.size();
        //     //这里必须要逐层遍历,不然深度的增加会出错
        //     while(n1--){
        //         cur=open1.front();
        //         open1.pop();
        //         //改用 逐个字母修改
        //         if(close2.count(cur)){
        //             return depth1+depth2;
        //         }
        //         if(close1.count(cur)){
        //             continue;
        //         }
        //         close1.insert(cur);
        //         for(auto& cbyte:cur){
        //             for(char i='a';i<='z';i++){
        //                 char temp=cbyte;
        //                 cbyte=i;
        //                 if(worddit.count(cur)&&temp!=i){
        //                     if(close1.count(cur)){
        //                         //排除无效的状态
        //                         //这里不排除会出错
        //                         cbyte=temp;
        //                         continue;
        //                     }
        //                     open1.push(cur);
        //                 }
        //                 cbyte=temp;
        //             }
        //         }
        //     }
        //     depth1++;
        //     int n2=open2.size();
        //     while(n2--){
        //         cur=open2.front();
        //         open2.pop();
        //          if(close1.count(cur)){
        //             return depth1+depth2;
        //         }
        //         if(close2.count(cur)){
        //             continue;
        //         }
        //         close2.insert(cur);
        //         //改用 逐个字母修改
        //         for(auto& cbyte:cur){
        //             for(char i='a';i<='z';i++){
        //                 char temp=cbyte;
        //                 cbyte=i;
        //                 if(worddit.count(cur)&&temp!=i){
        //                     if(close2.count(cur)){
        //                         //排除无效的状态
        //                         //这里不排除会出错
        //                         cbyte=temp;
        //                         continue;
        //                     }
        //                     open2.push(cur);
        //                 }
        //                 cbyte=temp;
        //             }
        //         }
        //     }
        //     depth2++;
        // }
        // return 0;
        
        
        
        
       // bfs
        // queue<string> open;
        // unordered_set<string> worddit(wordList.begin(),wordList.end());
        // //也可以用close表,这里用集合代替,访问过的单词会被擦除
        // int ans=1;
        // if(!worddit.count(endWord)){
        //     return 0;
        // }
        // open.push(beginWord);
        // string cur;
        // while(!open.empty()){
        //     int n=open.size();
        //     //这里必须要逐层遍历,不然深度的增加会出错
        //     while(n--){
        //         cur=open.front();
        //         open.pop();
        //         if(cur==endWord){
        //             return ans;
        //         }
        //         //此方法超时
        //         // for(auto word:wordList){
        //         //     int p=0;
        //         //     for(int i=0;i<word.size();i++){
        //         //         if(word[i]!=cur[i]){
        //         //             p++;
        //         //         }
        //         //     }
        //         //     if(p==1&&worddit.count(word)){
        //         //         open.push(word);
        //         //         worddit.erase(word);
        //         //     }
        //         // }

        //         //改用 逐个字母修改
        //         for(auto& cbyte:cur){
        //             for(char i='a';i<='z';i++){
        //                 char temp=cbyte;
        //                 cbyte=i;
        //                 if(worddit.count(cur)&&temp!=i){
        //                     open.push(cur);
        //                     worddit.erase(cur);
        //                 }
        //                 cbyte=temp;
        //             }
        //         }
        //     }
        //     ans++;
        // }
        // return 0;
    


    }
};

 

posted @ 2020-11-05 16:01  悲惨痛苦太刀  阅读(176)  评论(0编辑  收藏  举报