Skip to content

Commit 46d450e

Browse files
committed
721. Accounts Changes
1 parent fd2a97f commit 46d450e

1 file changed

Lines changed: 70 additions & 0 deletions

File tree

‎721. Accounts Merge.js‎

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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

Comments
 (0)