1+ /**
2+ * @param {string[][] } accounts
3+ * @return {string[][] }
4+ */
5+ var accountsMerge = function ( accounts ) {
6+ const edges = createGraph ( accounts )
7+ const email_name_map = createEmailNameMap ( accounts )
8+ let set_result = [ ]
9+ for ( let src_key in edges ) {
10+ let key_in_set = false
11+ for ( let set of set_result ) {
12+ if ( set . has ( src_key ) ) {
13+ key_in_set = true
14+ break
15+ }
16+ }
17+ if ( key_in_set ) continue
18+ let account = new Set ( )
19+ dfs ( src_key , edges , account )
20+ set_result . push ( account )
21+ }
22+ let result = [ ]
23+ for ( let emails of set_result ) {
24+ emails = [ ...emails ]
25+ emails . sort ( )
26+ let email = emails [ 0 ]
27+ emails . unshift ( email_name_map [ email ] )
28+ result . push ( emails )
29+ }
30+ return result
31+ } ;
32+
33+ function dfs ( src_key , edges , account , visited = { } ) {
34+ if ( visited [ src_key ] ) return false
35+ if ( ! ( src_key in edges ) ) return false
36+ // do something
37+ account . add ( src_key )
38+ visited [ src_key ] = true
39+ for ( let dest_key of edges [ src_key ] ) {
40+ dfs ( dest_key , edges , account , visited )
41+ }
42+ }
43+
44+ function createGraph ( accounts ) {
45+ const edges = { }
46+ for ( let account of accounts ) {
47+ if ( account . length === 2 && ! ( account [ 1 ] in edges ) ) edges [ account [ 1 ] ] = new Set ( )
48+ for ( let i = 1 ; i < account . length - 1 ; i ++ ) {
49+ let email = account [ i ]
50+ let next_email = account [ i + 1 ]
51+ if ( ! ( email in edges ) ) edges [ email ] = new Set ( )
52+ edges [ email ] . add ( next_email )
53+ if ( ! ( next_email in edges ) ) edges [ next_email ] = new Set ( )
54+ edges [ next_email ] . add ( email )
55+ }
56+ }
57+ return edges
58+ }
59+
60+ function createEmailNameMap ( accounts ) {
61+ const email_name_map = { }
62+ for ( let account of accounts ) {
63+ let name = account [ 0 ]
64+ for ( let i = 1 ; i < account . length ; i ++ ) {
65+ let email = account [ i ]
66+ email_name_map [ email ] = name
67+ }
68+ }
69+ return email_name_map
70+ }
0 commit comments