题目描述
AC代码
1.求出所有不同字母产生的字母集合
2.从下往上构造,看相邻两个字母可能构成的集合有哪些,递归枚举,直到能构建出金字塔的顶端
class Solution {
//allow用于保存所有不同字母产生的新字母集合
List<Character>[][] allow=new ArrayList[7][7];
public boolean pyramidTransition(String bottom, List<String> allowed) {
for(String s:allowed){
//a和b可以产生c,所以将c插入到allow集合中
int a=s.charAt(0)-'A',b=s.charAt(1)-'A';char c=s.charAt(2);
if(allow[a][b]==null)
allow[a][b]=new ArrayList<>();
allow[a][b].add(c);
}
//实际上每次存储记录的是相邻两层,所以我们第一次dfs的时候只需要记录最底层和当前层就可以了
return dfs(bottom,"");
}
boolean dfs(String last,String now){
if(last.length()==1)
return true;
if(last.length()==now.length()+1)
return dfs(now,"");
int a=last.charAt(now.length())-'A',b=last.charAt(now.length()+1)-'A';
if(allow[a][b]==null)return false;
for(char c:allow[a][b]){
if(dfs(last,now+c))
return true;
}
return false;
}
}