前言
写了两天报告,终于有时间了。感觉是近期做的难的题目。思路是,使用hashmap,将左右节点键成key,value为这个的列表。使用一个helper得到上一层的所有可能节点存放只list。使用深度搜索对每一层进行一个构建,之后判断构成能否构建金字塔
题目
源码
class Solution {
public boolean pyramidTransition(String bottom, List<String> allowed) {
HashMap<String,ArrayList<Character>> map=new HashMap<>();
for(String c:allowed){
String key =c.substring(0,2);//取前两个字符为key
char value=c.charAt(2);//最后一个字符为value
if(!map.containsKey(key)){
map.put(key,new ArrayList<>());
}
map.get(key).add(value);
}
return helper(bottom,map);
}
public boolean helper(String bottom,HashMap<String,ArrayList<Character>>map){
if(bottom.length()==1){
// 到顶层了
return true;
}
// n层长度
int len=bottom.length();
// n-1层长度
List<Character>[] lists=new List[len-1];
for(int i=1;i<len;i++){
// 获取n-1层的所有可能
lists[i-1]=map.getOrDefault(bottom.substring(i-1,i+1),new ArrayList<>());
}
return dfs(lists,0,new StringBuilder(),map);
}
public boolean dfs(List<Character>[]lists,int cur,StringBuilder sb,HashMap<String,ArrayList<Character>>map){
// 通过sb记录每一层的构建
// cur为当前层所遍历的bottom的第几个字符
if(cur==lists.length){
return helper(sb.toString(),map);
}
for (char c:lists[cur]){
sb.append(c);
if(dfs(lists,cur+1,sb,map)){
return true;
}
sb.deleteCharAt(sb.length()-1);
}
return false;
}
}