class Solution { private: unordered_map suppHash, memo; unordered_map > recipeHash; public: vector findAllRecipes(vector& recipes, vector>& ingredients, vector& supplies) { vector res; for (string supply : supplies) suppHash[supply]++; for (int i = 0; i < recipes.size(); i++) { recipeHash[recipes[i]] = ingredients[i]; } for (string rec : recipes) { if (dfs(rec)) res.push_back(rec); } return res; } bool dfs(string recipe) { if (memo[recipe]) return memo[recipe] == 1 ? true : false; vector recList = recipeHash[recipe]; for (string rec : recList) { if (!suppHash[rec]) { if (recipeHash.find(rec) == recipeHash.end() && !dfs(rec)) { memo[rec] = -1; return false; } } } memo[recipe] = 1; return true; } };