🗒️2115. 从给定原材料中找到所有可以做出的菜
2025-1-8
| 2025-1-8
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
创建时间
Jan 8, 2025 01:22 AM
你有 n 道不同菜的信息。给你一个字符串数组 recipes 和一个二维字符串数组 ingredients 。第 i 道菜的名字为 recipes[i] ,如果你有它 所有 的原材料 ingredients[i] ,那么你可以 做出 这道菜。一道菜的原材料可能是 另一道 菜,也就是说 ingredients[i] 可能包含 recipes 中另一个字符串。
同时给你一个字符串数组 supplies ,它包含你初始时拥有的所有原材料,每一种原材料你都有无限多。
请你返回你可以做出的所有菜。你可以以 任意顺序 返回它们。
注意两道菜在它们的原材料中可能互相包含。
  • n == recipes.length == ingredients.length
  • 1 <= n <= 100
  • 1 <= ingredients[i].length, supplies.length <= 100
  • 1 <= recipes[i].length, ingredients[i][j].length, supplies[k].length <= 10
  • recipes[i], ingredients[i][j] 和 supplies[k] 只包含小写英文字母。
  • 所有 recipes 和 supplies 中的值互不相同。
  • ingredients[i] 中的字符串互不相同。

拓扑排序

思路:本题首先要读懂题目。题目中有个条件十分重要——「所有 recipes 和 supplies 中的值互不相同」,这个条件告诉我们,图中没有自环,方便我们处理,不需要特殊讨论。因此我们可以直接使用拓扑排序的思想;
步骤
  • 构图:
    • 使用 unordered_map 来构图。其实和 vector 构图是一样,题中的节点标识是字符串类型,我们没办法使用下标来进行标识,故而采用哈希表。同理,节点度也采用同样的处理方式。
    • 此外,要注意理解题目的意思,图的方向不要构造反了。
  • 拓扑排序:
    • 初始化时,队列中的节点,需要经过校验后,才能放入。满足两个条件:节点度为 0 以及在 supplies 中。
    • 在拓扑排序的过程中,需要判断是否是菜谱中的菜,如果是,需要放入答案中。这样也使用哈希表来加速访问。
在初始化时,不需要判断节点度是否为 0,题目说明了「所有 recipes 和 supplies 中的值互不相同」,因此supplies中的节点必然是度为 0 的。

📎 参考

  • 【题单】图论算法
  • 851. 喧闹和富有128. 最长连续序列
    Loading...