单词接龙II

单词接龙II

 

 

详细思路

每一层,从curArr最后一个字符串变化一下后(用回溯),如果在dict就curArr并放进容器(用回溯),直到变化后是endWord,遍历层序遍历遍历容器,容器里面是每一层的字符串数组,fori--取出当前层的字符串数组curArr,记录curArr最后一个字符串为tail,如果tail==endWord更新答案,否则,对tail的每个字符,用a到z26个字符代替,如果代替后,dict找到相同的,用哈希集hadTry存储方便后序排除这种情况,放到curArr,curArr放到容器,或者不要tail继续尝试变成其他tail,如果tail当前字符a-z都不行了,tail当前字符回溯回原来并对tail其他字符操作。每次container某一次遍历完如果ans有了立刻结束,否则只能删除掉dict中hadTry过的字符串并进入下一层
哈希集dict存储字典,队列作为层序遍历容器container,这就是一棵从beginWord开始扩展的树,对这颗树层序遍历,在每一层当前层用哈希集hadTry存储尝试的字符串,这一层结束后把存储的字符串从字典dict中删除因为这一层不行下一层如果还是这个字符串更加不行。
 
精确定义
dict
container
hadTry
res
curArr
class Solution {
public:
    vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string>dict(wordList.begin(),wordList.end());
        vector<vector<string>>ans;
        queue<vector<string>>container;
        container.push({beginWord});
        while(!container.empty()){
            unordered_set<string>hadTry;
            for(int i=container.size();i>0;i--){
                vector<string>curArr=container.front();container.pop();
                string tail=curArr.back();
                if(tail==endWord){
                    ans.push_back(curArr);
                    continue;
                }
                for(int j=0;j<tail.size();j++){
                    char tmp=tail[j];//
                    for(char c=a;c<=z;c++){
                        if(c==tmp)continue;//原始状态
                        tail[j]=c;
                        if(!dict.count(tail))continue;//不可
                        hadTry.insert(tail);//记录,之后可删除剪枝
                        curArr.push_back(tail);//
                        container.push(curArr);//
                        curArr.pop_back();//不要
                    }
                    tail[j]=tmp;//不要
                }
            }
            if(ans.size())return ans;//当前层完
            for(auto &s:hadTry)dict.erase(s);
        }
        return {};
    }
};

 

单词接龙II

上一篇:LeetCode-031-下一个排列


下一篇:CF396C On Changing Tree