Skip to content

Commit 85728fc

Browse files
committed
feat: add solutions to lcci problem: No.17.07.Baby Names
1 parent 9da2d09 commit 85728fc

File tree

4 files changed

+317
-4
lines changed

4 files changed

+317
-4
lines changed

lcci/17.07.Baby Names/README.md

+107-2
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,127 @@
2424

2525
<!-- 这里可写通用的实现逻辑 -->
2626

27+
并查集。
28+
2729
<!-- tabs:start -->
2830

2931
### **Python3**
3032

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

3335
```python
34-
36+
class Solution:
37+
def trulyMostPopular(self, names: List[str], synonyms: List[str]) -> List[str]:
38+
mp = collections.defaultdict(int)
39+
p = collections.defaultdict(str)
40+
41+
def find(x):
42+
if p[x] != x:
43+
p[x] = find(p[x])
44+
return p[x]
45+
46+
def union(a, b):
47+
pa, pb = find(a), find(b)
48+
if pa == pb:
49+
return
50+
if pa > pb:
51+
mp[pb] += mp[pa]
52+
p[pa] = pb
53+
else:
54+
mp[pa] += mp[pb]
55+
p[pb] = pa
56+
57+
for e in names:
58+
idx = e.find("(")
59+
name, w = e[: idx], int(e[idx + 1: -1])
60+
mp[name] = w
61+
p[name] = name
62+
for e in synonyms:
63+
idx = e.find(",")
64+
name1, name2 = e[1: idx], e[idx + 1: -1]
65+
mp[name1] += 0
66+
mp[name2] += 0
67+
p[name1] = name1
68+
p[name2] = name2
69+
70+
for e in synonyms:
71+
idx = e.find(",")
72+
name1, name2 = e[1: idx], e[idx + 1: -1]
73+
union(name1, name2)
74+
return [f'{name}({mp[name]})' for name, w in mp.items() if name == find(name)]
3575
```
3676

3777
### **Java**
3878

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

4181
```java
42-
82+
class Solution {
83+
private Map<String, Integer> mp = new HashMap<>();
84+
private Map<String, String> p = new HashMap<>();
85+
86+
public String[] trulyMostPopular(String[] names, String[] synonyms) {
87+
for (String e : names) {
88+
int idx = e.indexOf("(");
89+
String name = e.substring(0, idx);
90+
int w = Integer.parseInt(e.substring(idx + 1, e.length() - 1));
91+
mp.put(name, w);
92+
p.put(name, name);
93+
}
94+
for (String e : synonyms) {
95+
int idx = e.indexOf(",");
96+
String name1 = e.substring(1, idx);
97+
String name2 = e.substring(idx + 1, e.length() - 1);
98+
if (!mp.containsKey(name1)) {
99+
mp.put(name1, 0);
100+
}
101+
if (!mp.containsKey(name2)) {
102+
mp.put(name2, 0);
103+
}
104+
p.put(name1, name1);
105+
p.put(name2, name2);
106+
}
107+
for (String e : synonyms) {
108+
int idx = e.indexOf(",");
109+
String name1 = e.substring(1, idx);
110+
String name2 = e.substring(idx + 1, e.length() - 1);
111+
union(name1, name2);
112+
}
113+
List<String> t = new ArrayList<>();
114+
for (Map.Entry<String, Integer> e : mp.entrySet()) {
115+
String name = e.getKey();
116+
if (Objects.equals(name, find(name))) {
117+
t.add(name + "(" + e.getValue() + ")");
118+
}
119+
}
120+
String[] res = new String[t.size()];
121+
for (int i = 0; i < res.length; ++i) {
122+
res[i] = t.get(i);
123+
}
124+
return res;
125+
}
126+
127+
private String find(String x) {
128+
if (!Objects.equals(p.get(x), x)) {
129+
p.put(x, find(p.get(x)));
130+
}
131+
return p.get(x);
132+
}
133+
134+
private void union(String a, String b) {
135+
String pa = find(a), pb = find(b);
136+
if (Objects.equals(pa, pb)) {
137+
return;
138+
}
139+
if (pa.compareTo(pb) > 0) {
140+
mp.put(pb, mp.getOrDefault(pb, 0) + mp.getOrDefault(pa, 0));
141+
p.put(pa, pb);
142+
} else {
143+
mp.put(pa, mp.getOrDefault(pa, 0) + mp.getOrDefault(pb, 0));
144+
p.put(pb, pa);
145+
}
146+
}
147+
}
43148
```
44149

45150
### **...**

lcci/17.07.Baby Names/README_EN.md

+105-2
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,116 @@
2727
### **Python3**
2828

2929
```python
30-
30+
class Solution:
31+
def trulyMostPopular(self, names: List[str], synonyms: List[str]) -> List[str]:
32+
mp = collections.defaultdict(int)
33+
p = collections.defaultdict(str)
34+
35+
def find(x):
36+
if p[x] != x:
37+
p[x] = find(p[x])
38+
return p[x]
39+
40+
def union(a, b):
41+
pa, pb = find(a), find(b)
42+
if pa == pb:
43+
return
44+
if pa > pb:
45+
mp[pb] += mp[pa]
46+
p[pa] = pb
47+
else:
48+
mp[pa] += mp[pb]
49+
p[pb] = pa
50+
51+
for e in names:
52+
idx = e.find("(")
53+
name, w = e[: idx], int(e[idx + 1: -1])
54+
mp[name] = w
55+
p[name] = name
56+
for e in synonyms:
57+
idx = e.find(",")
58+
name1, name2 = e[1: idx], e[idx + 1: -1]
59+
mp[name1] += 0
60+
mp[name2] += 0
61+
p[name1] = name1
62+
p[name2] = name2
63+
64+
for e in synonyms:
65+
idx = e.find(",")
66+
name1, name2 = e[1: idx], e[idx + 1: -1]
67+
union(name1, name2)
68+
return [f'{name}({mp[name]})' for name, w in mp.items() if name == find(name)]
3169
```
3270

3371
### **Java**
3472

3573
```java
36-
74+
class Solution {
75+
private Map<String, Integer> mp = new HashMap<>();
76+
private Map<String, String> p = new HashMap<>();
77+
78+
public String[] trulyMostPopular(String[] names, String[] synonyms) {
79+
for (String e : names) {
80+
int idx = e.indexOf("(");
81+
String name = e.substring(0, idx);
82+
int w = Integer.parseInt(e.substring(idx + 1, e.length() - 1));
83+
mp.put(name, w);
84+
p.put(name, name);
85+
}
86+
for (String e : synonyms) {
87+
int idx = e.indexOf(",");
88+
String name1 = e.substring(1, idx);
89+
String name2 = e.substring(idx + 1, e.length() - 1);
90+
if (!mp.containsKey(name1)) {
91+
mp.put(name1, 0);
92+
}
93+
if (!mp.containsKey(name2)) {
94+
mp.put(name2, 0);
95+
}
96+
p.put(name1, name1);
97+
p.put(name2, name2);
98+
}
99+
for (String e : synonyms) {
100+
int idx = e.indexOf(",");
101+
String name1 = e.substring(1, idx);
102+
String name2 = e.substring(idx + 1, e.length() - 1);
103+
union(name1, name2);
104+
}
105+
List<String> t = new ArrayList<>();
106+
for (Map.Entry<String, Integer> e : mp.entrySet()) {
107+
String name = e.getKey();
108+
if (Objects.equals(name, find(name))) {
109+
t.add(name + "(" + e.getValue() + ")");
110+
}
111+
}
112+
String[] res = new String[t.size()];
113+
for (int i = 0; i < res.length; ++i) {
114+
res[i] = t.get(i);
115+
}
116+
return res;
117+
}
118+
119+
private String find(String x) {
120+
if (!Objects.equals(p.get(x), x)) {
121+
p.put(x, find(p.get(x)));
122+
}
123+
return p.get(x);
124+
}
125+
126+
private void union(String a, String b) {
127+
String pa = find(a), pb = find(b);
128+
if (Objects.equals(pa, pb)) {
129+
return;
130+
}
131+
if (pa.compareTo(pb) > 0) {
132+
mp.put(pb, mp.getOrDefault(pb, 0) + mp.getOrDefault(pa, 0));
133+
p.put(pa, pb);
134+
} else {
135+
mp.put(pa, mp.getOrDefault(pa, 0) + mp.getOrDefault(pb, 0));
136+
p.put(pb, pa);
137+
}
138+
}
139+
}
37140
```
38141

39142
### **...**

lcci/17.07.Baby Names/Solution.java

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
class Solution {
2+
private Map<String, Integer> mp = new HashMap<>();
3+
private Map<String, String> p = new HashMap<>();
4+
5+
public String[] trulyMostPopular(String[] names, String[] synonyms) {
6+
for (String e : names) {
7+
int idx = e.indexOf("(");
8+
String name = e.substring(0, idx);
9+
int w = Integer.parseInt(e.substring(idx + 1, e.length() - 1));
10+
mp.put(name, w);
11+
p.put(name, name);
12+
}
13+
for (String e : synonyms) {
14+
int idx = e.indexOf(",");
15+
String name1 = e.substring(1, idx);
16+
String name2 = e.substring(idx + 1, e.length() - 1);
17+
if (!mp.containsKey(name1)) {
18+
mp.put(name1, 0);
19+
}
20+
if (!mp.containsKey(name2)) {
21+
mp.put(name2, 0);
22+
}
23+
p.put(name1, name1);
24+
p.put(name2, name2);
25+
}
26+
for (String e : synonyms) {
27+
int idx = e.indexOf(",");
28+
String name1 = e.substring(1, idx);
29+
String name2 = e.substring(idx + 1, e.length() - 1);
30+
union(name1, name2);
31+
}
32+
List<String> t = new ArrayList<>();
33+
for (Map.Entry<String, Integer> e : mp.entrySet()) {
34+
String name = e.getKey();
35+
if (Objects.equals(name, find(name))) {
36+
t.add(name + "(" + e.getValue() + ")");
37+
}
38+
}
39+
String[] res = new String[t.size()];
40+
for (int i = 0; i < res.length; ++i) {
41+
res[i] = t.get(i);
42+
}
43+
return res;
44+
}
45+
46+
private String find(String x) {
47+
if (!Objects.equals(p.get(x), x)) {
48+
p.put(x, find(p.get(x)));
49+
}
50+
return p.get(x);
51+
}
52+
53+
private void union(String a, String b) {
54+
String pa = find(a), pb = find(b);
55+
if (Objects.equals(pa, pb)) {
56+
return;
57+
}
58+
if (pa.compareTo(pb) > 0) {
59+
mp.put(pb, mp.getOrDefault(pb, 0) + mp.getOrDefault(pa, 0));
60+
p.put(pa, pb);
61+
} else {
62+
mp.put(pa, mp.getOrDefault(pa, 0) + mp.getOrDefault(pb, 0));
63+
p.put(pb, pa);
64+
}
65+
}
66+
}

lcci/17.07.Baby Names/Solution.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution:
2+
def trulyMostPopular(self, names: List[str], synonyms: List[str]) -> List[str]:
3+
mp = collections.defaultdict(int)
4+
p = collections.defaultdict(str)
5+
6+
def find(x):
7+
if p[x] != x:
8+
p[x] = find(p[x])
9+
return p[x]
10+
11+
def union(a, b):
12+
pa, pb = find(a), find(b)
13+
if pa == pb:
14+
return
15+
if pa > pb:
16+
mp[pb] += mp[pa]
17+
p[pa] = pb
18+
else:
19+
mp[pa] += mp[pb]
20+
p[pb] = pa
21+
22+
for e in names:
23+
idx = e.find("(")
24+
name, w = e[: idx], int(e[idx + 1: -1])
25+
mp[name] = w
26+
p[name] = name
27+
for e in synonyms:
28+
idx = e.find(",")
29+
name1, name2 = e[1: idx], e[idx + 1: -1]
30+
mp[name1] += 0
31+
mp[name2] += 0
32+
p[name1] = name1
33+
p[name2] = name2
34+
35+
for e in synonyms:
36+
idx = e.find(",")
37+
name1, name2 = e[1: idx], e[idx + 1: -1]
38+
union(name1, name2)
39+
return [f'{name}({mp[name]})' for name, w in mp.items() if name == find(name)]

0 commit comments

Comments
 (0)