详细思路
每一层,从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 {}; } };