Skip to content

Commit 593670e

Browse files
authored
feat: add swift implementation to lcci problem: No.17.07 (doocs#2779)
1 parent a88a827 commit 593670e

File tree

3 files changed

+159
-0
lines changed

3 files changed

+159
-0
lines changed

lcci/17.07.Baby Names/README.md

+54
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,60 @@ function trulyMostPopular(names: string[], synonyms: string[]): string[] {
245245
}
246246
```
247247

248+
```swift
249+
class Solution {
250+
private var graph = [String: [String]]()
251+
private var count = [String: Int]()
252+
private var visited = Set<String>()
253+
private var freq: Int = 0
254+
255+
func trulyMostPopular(_ names: [String], _ synonyms: [String]) -> [String] {
256+
for pair in synonyms {
257+
let cleanPair = pair.dropFirst().dropLast()
258+
let parts = cleanPair.split(separator: ",").map(String.init)
259+
let a = parts[0], b = parts[1]
260+
graph[a, default: []].append(b)
261+
graph[b, default: []].append(a)
262+
}
263+
264+
var namesSet = Set<String>()
265+
for name in names {
266+
let index = name.firstIndex(of: "(")!
267+
let realName = String(name[..<index])
268+
namesSet.insert(realName)
269+
let num = Int(name[name.index(after: index)..<name.index(before: name.endIndex)])!
270+
count[realName] = num
271+
}
272+
273+
var result = [String]()
274+
for name in namesSet {
275+
if !visited.contains(name) {
276+
freq = 0
277+
let representative = dfs(name)
278+
result.append("\(representative)(\(freq))")
279+
}
280+
}
281+
282+
return result
283+
}
284+
285+
private func dfs(_ name: String) -> String {
286+
var minName = name
287+
visited.insert(name)
288+
freq += count[name, default: 0]
289+
for neighbor in graph[name, default: []] {
290+
if !visited.contains(neighbor) {
291+
let temp = dfs(neighbor)
292+
if temp < minName {
293+
minName = temp
294+
}
295+
}
296+
}
297+
return minName
298+
}
299+
}
300+
```
301+
248302
<!-- tabs:end -->
249303

250304
<!-- end -->

lcci/17.07.Baby Names/README_EN.md

+54
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,60 @@ function trulyMostPopular(names: string[], synonyms: string[]): string[] {
245245
}
246246
```
247247

248+
```swift
249+
class Solution {
250+
private var graph = [String: [String]]()
251+
private var count = [String: Int]()
252+
private var visited = Set<String>()
253+
private var freq: Int = 0
254+
255+
func trulyMostPopular(_ names: [String], _ synonyms: [String]) -> [String] {
256+
for pair in synonyms {
257+
let cleanPair = pair.dropFirst().dropLast()
258+
let parts = cleanPair.split(separator: ",").map(String.init)
259+
let a = parts[0], b = parts[1]
260+
graph[a, default: []].append(b)
261+
graph[b, default: []].append(a)
262+
}
263+
264+
var namesSet = Set<String>()
265+
for name in names {
266+
let index = name.firstIndex(of: "(")!
267+
let realName = String(name[..<index])
268+
namesSet.insert(realName)
269+
let num = Int(name[name.index(after: index)..<name.index(before: name.endIndex)])!
270+
count[realName] = num
271+
}
272+
273+
var result = [String]()
274+
for name in namesSet {
275+
if !visited.contains(name) {
276+
freq = 0
277+
let representative = dfs(name)
278+
result.append("\(representative)(\(freq))")
279+
}
280+
}
281+
282+
return result
283+
}
284+
285+
private func dfs(_ name: String) -> String {
286+
var minName = name
287+
visited.insert(name)
288+
freq += count[name, default: 0]
289+
for neighbor in graph[name, default: []] {
290+
if !visited.contains(neighbor) {
291+
let temp = dfs(neighbor)
292+
if temp < minName {
293+
minName = temp
294+
}
295+
}
296+
}
297+
return minName
298+
}
299+
}
300+
```
301+
248302
<!-- tabs:end -->
249303

250304
<!-- end -->

lcci/17.07.Baby Names/Solution.swift

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
class Solution {
2+
private var graph = [String: [String]]()
3+
private var count = [String: Int]()
4+
private var visited = Set<String>()
5+
private var freq: Int = 0
6+
7+
func trulyMostPopular(_ names: [String], _ synonyms: [String]) -> [String] {
8+
for pair in synonyms {
9+
let cleanPair = pair.dropFirst().dropLast()
10+
let parts = cleanPair.split(separator: ",").map(String.init)
11+
let a = parts[0], b = parts[1]
12+
graph[a, default: []].append(b)
13+
graph[b, default: []].append(a)
14+
}
15+
16+
var namesSet = Set<String>()
17+
for name in names {
18+
let index = name.firstIndex(of: "(")!
19+
let realName = String(name[..<index])
20+
namesSet.insert(realName)
21+
let num = Int(name[name.index(after: index)..<name.index(before: name.endIndex)])!
22+
count[realName] = num
23+
}
24+
25+
var result = [String]()
26+
for name in namesSet {
27+
if !visited.contains(name) {
28+
freq = 0
29+
let representative = dfs(name)
30+
result.append("\(representative)(\(freq))")
31+
}
32+
}
33+
34+
return result
35+
}
36+
37+
private func dfs(_ name: String) -> String {
38+
var minName = name
39+
visited.insert(name)
40+
freq += count[name, default: 0]
41+
for neighbor in graph[name, default: []] {
42+
if !visited.contains(neighbor) {
43+
let temp = dfs(neighbor)
44+
if temp < minName {
45+
minName = temp
46+
}
47+
}
48+
}
49+
return minName
50+
}
51+
}

0 commit comments

Comments
 (0)