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