Accounts Merge

The problem description can be found in LeetCode.

Approach

This is an implicit Graph problem. In particular, we need to find a way to connect these emails based on some logic.

In fact, at first, we don't care about the name of the account. We just want to group these emails. Eventually, each group of emails will belong to a certain account.

First, we build the Adjacency List based on the emails. Secondly, we perform a DFS to iterate over this sub-groups.

Solution

from collections import defaultdict from typing import DefaultDict, List, Set class Solution: def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]: graph = self.get_adjacency_list(accounts) return self.group_emails(accounts, graph) def get_adjacency_list( self, accounts: List[List[str]] ) -> DefaultDict[str, List[str]]: graph = defaultdict(list) for account in accounts: emails = account[1:] assert len(emails) > 0 first_email = emails[0] for email in emails[1:]: graph[first_email].append(email) graph[email].append(first_email) return graph def group_emails( self, accounts: List[List[str]], graph: DefaultDict[str, List[str]] ) -> List[List[str]]: visited: Set[str] = set() ans = [] for account in accounts: name = account[0] first_email = account[1] if first_email in visited: continue emails: List[str] = [] self.dfs(graph, first_email, emails, visited) emails.sort() ans.append([name] + emails) return ans def dfs( self, graph: DefaultDict[str, List[str]], email: str, emails: List[str], visited: Set[str], ) -> None: if email in visited: return visited.add(email) emails.append(email) for neighbor in graph[email]: self.dfs(graph, neighbor, emails, visited)

Complexity

  • Time:
  • Space:

Where and are the number of accounts and the maximum length of a certain account, respectively.