@@ -245,6 +245,60 @@ function trulyMostPopular(names: string[], synonyms: string[]): string[] {
245
245
}
246
246
```
247
247
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
+
248
302
<!-- tabs:end -->
249
303
250
304
<!-- end -->
0 commit comments