我正在研究以下问题:
假设您有一个菜肴列表,其中每道菜都与配料列表相关联。将具有常见成分的菜肴分组在一起。
例如:
输入:
"Pasta" -> ["Tomato Sauce", "Onions", "Garlic"]
"Chicken Curry" --> ["Chicken", "Curry Sauce"]
"Fried Rice" --> ["Rice", "Onions", "Nuts"]
"Salad" --> ["Spinach", "Nuts"]
"Sandwich" --> ["Cheese", "Bread"]
"Quesadilla" --> ["Chicken", "Cheese"]
输出:
("Pasta", "Fried Rice")
("Fried Rice, "Salad")
("Chicken Curry", "Quesadilla")
("Sandwich", "Quesadilla")
另外,时间和空间的复杂性是什么?
我想出了下面的代码。有没有更好的方法来解决这个问题?看起来算法是图论中的连接组件。
public static void main(String[] args) {
List<String> ing1 = Arrays.asList("Tomato Sauce", "Onions", "Garlic");
List<String> ing2 = Arrays.asList("Chicken", "Curry Sauce");
List<String> ing3 = Arrays.asList("Rice", "Onions", "Nuts");
List<String> ing4 = Arrays.asList("Spinach", "Nuts");
List<String> ing5 = Arrays.asList("Cheese", "Bread");
List<String> ing6 = Arrays.asList("Chicken", "Cheese");
Map<String, List<String>> map = new HashMap<>();
map.put("Pasta", ing1);
map.put("Chicken Curry", ing2);
map.put("Fried Rice", ing3);
map.put("Salad", ing4);
map.put("Sandwich", ing5);
map.put("Quesadilla", ing6);
System.out.println(group(map));
}
private static List<List<String>> group(Map<String, List<String>> map) {
List<List<String>> output = new ArrayList<>();
if (map == null || map.isEmpty()) {
return output;
}
Map<String, List<String>> holder = new HashMap<>();
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
String key = entry.getKey();
List<String> value = entry.getValue();
for (String v : value) {
if (!holder.containsKey(v)) {
holder.put(v, new ArrayList<String>());
}
holder.get(v).add(key);
}
}
return new ArrayList<List<String>>(holder.values());
}
慕神8447489
慕仙森
MMTTMM
慕妹3146593
相关分类