思路分析:首先我们需要知道每构造一次,bottom的长度减一,当bottom的长度 == 1时说明构造成功了。而每次构造都是按顺序取出bottom中的两个字母,确定第三个字母(‘A’到‘G’一共7种可能),这时我们再去判断当前三元组是否在规则中,如果在规则中我们就继续构造。当我们把bottom构造得到下一层nextStr,再使用nextStr构造下一层…直到bottom的大小 == 1。
总结:这类dfs是找到一个正确解就返回,下一次dfs的时候有两种方向:
①该层还没有搜索完,还应该继续在该层中搜索,对应的代码为:
所以在这里是判断它返回的真假值,若可行才返回true,而不是直接return。
②该层已经搜索完,进行下一层的搜索:
代码:
class Solution {
public:
int maxl=0;
bool dfs(string &nowstr,string nextstr, unordered_set<string>& myAllowed){
int nowsize=nowstr.size();
int nextsize=nextstr.size();
if(nowstr.size()==1)
return true;
if(nowsize-nextsize>1){
for (char ch = 'A'; ch < 'H'; ++ch){
string str=nowstr.substr(nextsize,2)+ch;
auto it=myAllowed.find(str);
if(it!=myAllowed.end()&&dfs(nowstr,nextstr+(*it)[2],myAllowed))
return true;
}
}
else
return dfs(nextstr,"",myAllowed);
return false;
}
bool pyramidTransition(string bottom, vector<string>& allowed) {
unordered_set<string> myAllowed(allowed.begin(), allowed.end());
maxl=bottom.size()-1;
return dfs(bottom,"", myAllowed);
}
};