ให้รายการภูมิภาคหลายชุด โดยภูมิภาคตัวแรกของแต่ละชุดจะครอบคลุมภูมิภาคอื่นๆ ในชุดนั้น นั่นคือ ถ้า X ครอบคลุม Y แสดงว่า X ใหญ่กว่า Y และทุกภูมิภาคครอบคลุมตัวเองด้วย กำหนดภูมิภาคสองแห่ง r1 และ r2 ต้องการหาภูมิภาคที่เล็กที่สุดที่ครอบคลุมทั้งสองแห่ง
ตัวอย่าง: อินพุต [["Earth","North America","South America"], ["North America","United States","Canada"], ["United States","New York","Boston"], ["Canada","Ontario","Quebec"], ["South America","Brazil"]] และ r1 = "Quebec", r2 = "New York" ผลลัพธ์คือ "North America"
ขั้นตอนการแก้ปัญหา
- สร้าง map
parentเก็บพาเรนต์ของแต่ละภูมิภาค - วนลูปทุกชุด: สำหรับ
j = 1ถึงสิ้นสุด ให้parent[r[i][j]] = r[i][0] - สร้างเซต
chainใส่x(r1) เข้าไป - เดินขึ้นตามพาเรนต์ของ
xจนหมด ใส่ทุกตัวเข้าchain - เดินขึ้นตามพาเรนต์ของ
y(r2) จนพบตัวที่อยู่ในchain - คืนค่า
yนั้น (คือ LCA / Common Ancestor ที่ลึกที่สุด)
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string findSmallestRegion(vector<vector<string>>& r, string x, string y) {
unordered_map<string, string> parent;
for (auto& vec : r) {
for (int j = 1; j < vec.size(); j++) {
parent[vec[j]] = vec[0];
}
}
unordered_set<string> chain;
chain.insert(x);
while (parent.count(x)) {
x = parent[x];
chain.insert(x);
}
while (!chain.count(y)) {
y = parent[y];
}
return y;
}
};
int main() {
vector<vector<string>> v = {
{"Earth","North America","South America"},
{"North America","United States","Canada"},
{"United States","New York","Boston"},
{"Canada","Ontario","Quebec"},
{"South America","Brazil"}
};
Solution ob;
cout << ob.findSmallestRegion(v, "Quebec", "New York");
}
Input
[["Earth","North America","South America"],["North America","United States","Canada"],["United States","New York","Boston"],["Canada","Ontario","Quebec"],["South America","Brazil"]] "Quebec" "New York"
Output
North America