详细解析看代码,坑点在会自环,另外我只会map。。。读者自行优化哈哈
class Solution {
private Map<String,Integer> su=new HashMap<>();//原材料
private Map<String,Integer> st=new HashMap<>();//食谱
private Map<String, List<String>> re=new HashMap<>();//制作还没完成的材料,即会导致自环的材料
public List<String> findAllRecipes(String[] recipes, List<List<String>> ingredients, String[] supplies) {
//先将原材料,食谱传进哈希表,方便后续查询
for (String cnt: supplies){
su.put(cnt,1);
}
for (int i=0;i< recipes.length;i++){
re.put(recipes[i],ingredients.get(i));
}
List<String> ans=new ArrayList<>();
//对每个食谱进行查询
for (int i=0;i< recipes.length;i++){
if(check(recipes[i])){
ans.add(recipes[i]);
}
}
return ans;
}
private boolean check(String cnt){
//如果有这个材料,返回真
if(su.containsKey(cnt))return true;
//如果没有材料但是有食谱,开始,查询是否有或者能合成这个材料
if(re.containsKey(cnt)){
List<String> list=re.get(cnt);
st.put(cnt,1);//标记一下开始制作但没有完成的材料
for (String s:list){
if(st.containsKey(s))return false;//这个材料还没制作好呢,返回false
if(!check(s))return false;//这个材料造不出来,也返回false
}
st.remove(cnt);//制作好了,删掉
if(!su.containsKey(cnt))
su.put(cnt,1);//把这个制作好的材料加进材料数组,后面不用重新造
return true;
}
return false;
}
}