Skip to content

Commit 13f21fa

Browse files
committed
feat: add solutions to lc problem: No.1257
No.1257.Smallest Common Region
1 parent 1c4b51d commit 13f21fa

File tree

6 files changed

+230
-2
lines changed

6 files changed

+230
-2
lines changed

solution/1200-1299/1257.Smallest Common Region/README.md

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,111 @@ region2 = "New York"
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49+
题目可转换为“求最近公共祖先”问题。
50+
4951
<!-- tabs:start -->
5052

5153
### **Python3**
5254

5355
<!-- 这里可写当前语言的特殊实现逻辑 -->
5456

5557
```python
56-
58+
class Solution:
59+
def findSmallestRegion(self, regions: List[List[str]], region1: str, region2: str) -> str:
60+
m = {}
61+
for region in regions:
62+
for r in region[1:]:
63+
m[r] = region[0]
64+
s = set()
65+
while m.get(region1):
66+
s.add(region1)
67+
region1 = m[region1]
68+
while m.get(region2):
69+
if region2 in s:
70+
return region2
71+
region2 = m[region2]
72+
return region1
5773
```
5874

5975
### **Java**
6076

6177
<!-- 这里可写当前语言的特殊实现逻辑 -->
6278

6379
```java
80+
class Solution {
81+
public String findSmallestRegion(List<List<String>> regions, String region1, String region2) {
82+
Map<String, String> m = new HashMap<>();
83+
for (List<String> region : regions) {
84+
for (int i = 1; i < region.size(); ++i) {
85+
m.put(region.get(i), region.get(0));
86+
}
87+
}
88+
Set<String> s = new HashSet<>();
89+
while (m.containsKey(region1)) {
90+
s.add(region1);
91+
region1 = m.get(region1);
92+
}
93+
while (m.containsKey(region2)) {
94+
if (s.contains(region2)) {
95+
return region2;
96+
}
97+
region2 = m.get(region2);
98+
}
99+
return region1;
100+
}
101+
}
102+
```
103+
104+
### **C++**
105+
106+
```cpp
107+
class Solution {
108+
public:
109+
string findSmallestRegion(vector<vector<string>>& regions, string region1, string region2) {
110+
unordered_map<string, string> m;
111+
for (auto& region : regions)
112+
for (int i = 1; i < region.size(); ++i)
113+
m[region[i]] = region[0];
114+
unordered_set<string> s;
115+
while (m.count(region1))
116+
{
117+
s.insert(region1);
118+
region1 = m[region1];
119+
}
120+
while (m.count(region2))
121+
{
122+
if (s.count(region2)) return region2;
123+
region2 = m[region2];
124+
}
125+
return region1;
126+
}
127+
};
128+
```
64129
130+
### **C++**
131+
132+
```cpp
133+
class Solution {
134+
public:
135+
string findSmallestRegion(vector<vector<string>>& regions, string region1, string region2) {
136+
unordered_map<string, string> m;
137+
for (auto& region : regions)
138+
for (int i = 1; i < region.size(); ++i)
139+
m[region[i]] = region[0];
140+
unordered_set<string> s;
141+
while (m.count(region1))
142+
{
143+
s.insert(region1);
144+
region1 = m[region1];
145+
}
146+
while (m.count(region2))
147+
{
148+
if (s.count(region2)) return region2;
149+
region2 = m[region2];
150+
}
151+
return region1;
152+
}
153+
};
65154
```
66155

67156
### **...**

solution/1200-1299/1257.Smallest Common Region/README_EN.md

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,74 @@ region2 = &quot;New York&quot;
4545
### **Python3**
4646

4747
```python
48-
48+
class Solution:
49+
def findSmallestRegion(self, regions: List[List[str]], region1: str, region2: str) -> str:
50+
m = {}
51+
for region in regions:
52+
for r in region[1:]:
53+
m[r] = region[0]
54+
s = set()
55+
while m.get(region1):
56+
s.add(region1)
57+
region1 = m[region1]
58+
while m.get(region2):
59+
if region2 in s:
60+
return region2
61+
region2 = m[region2]
62+
return region1
4963
```
5064

5165
### **Java**
5266

5367
```java
68+
class Solution {
69+
public String findSmallestRegion(List<List<String>> regions, String region1, String region2) {
70+
Map<String, String> m = new HashMap<>();
71+
for (List<String> region : regions) {
72+
for (int i = 1; i < region.size(); ++i) {
73+
m.put(region.get(i), region.get(0));
74+
}
75+
}
76+
Set<String> s = new HashSet<>();
77+
while (m.containsKey(region1)) {
78+
s.add(region1);
79+
region1 = m.get(region1);
80+
}
81+
while (m.containsKey(region2)) {
82+
if (s.contains(region2)) {
83+
return region2;
84+
}
85+
region2 = m.get(region2);
86+
}
87+
return region1;
88+
}
89+
}
90+
```
5491

92+
### **C++**
93+
94+
```cpp
95+
class Solution {
96+
public:
97+
string findSmallestRegion(vector<vector<string>>& regions, string region1, string region2) {
98+
unordered_map<string, string> m;
99+
for (auto& region : regions)
100+
for (int i = 1; i < region.size(); ++i)
101+
m[region[i]] = region[0];
102+
unordered_set<string> s;
103+
while (m.count(region1))
104+
{
105+
s.insert(region1);
106+
region1 = m[region1];
107+
}
108+
while (m.count(region2))
109+
{
110+
if (s.count(region2)) return region2;
111+
region2 = m[region2];
112+
}
113+
return region1;
114+
}
115+
};
55116
```
56117
57118
### **...**
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
string findSmallestRegion(vector<vector<string>>& regions, string region1, string region2) {
4+
unordered_map<string, string> m;
5+
for (auto& region : regions)
6+
for (int i = 1; i < region.size(); ++i)
7+
m[region[i]] = region[0];
8+
unordered_set<string> s;
9+
while (m.count(region1))
10+
{
11+
s.insert(region1);
12+
region1 = m[region1];
13+
}
14+
while (m.count(region2))
15+
{
16+
if (s.count(region2)) return region2;
17+
region2 = m[region2];
18+
}
19+
return region1;
20+
}
21+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func findSmallestRegion(regions [][]string, region1 string, region2 string) string {
2+
m := make(map[string]string)
3+
for _, region := range regions {
4+
for i := 1; i < len(region); i++ {
5+
m[region[i]] = region[0]
6+
}
7+
}
8+
s := make(map[string]bool)
9+
for region1 != "" {
10+
s[region1] = true
11+
region1 = m[region1]
12+
}
13+
for region2 != "" {
14+
if s[region2] {
15+
return region2
16+
}
17+
region2 = m[region2]
18+
}
19+
return region1
20+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public String findSmallestRegion(List<List<String>> regions, String region1, String region2) {
3+
Map<String, String> m = new HashMap<>();
4+
for (List<String> region : regions) {
5+
for (int i = 1; i < region.size(); ++i) {
6+
m.put(region.get(i), region.get(0));
7+
}
8+
}
9+
Set<String> s = new HashSet<>();
10+
while (m.containsKey(region1)) {
11+
s.add(region1);
12+
region1 = m.get(region1);
13+
}
14+
while (m.containsKey(region2)) {
15+
if (s.contains(region2)) {
16+
return region2;
17+
}
18+
region2 = m.get(region2);
19+
}
20+
return region1;
21+
}
22+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def findSmallestRegion(self, regions: List[List[str]], region1: str, region2: str) -> str:
3+
m = {}
4+
for region in regions:
5+
for r in region[1:]:
6+
m[r] = region[0]
7+
s = set()
8+
while m.get(region1):
9+
s.add(region1)
10+
region1 = m[region1]
11+
while m.get(region2):
12+
if region2 in s:
13+
return region2
14+
region2 = m[region2]
15+
return region1

0 commit comments

Comments
 (0)