![]() |
VOOZH | about |
Bob, a teacher of St. Joseph School given a task by his principal to merge the details of the students where each element details[i] is a list of strings, where the first element details[i][0] is a name of the student, and the rest of the elements are emails representing emails of the student. Two details belong to the same student if there is some common email to both details. After merging the details, return the details of the student in the following format: the first element of each detail is the name of the student, and the rest of the elements are emails in sorted order.
Note: Two details have the same name, they may belong to different people as people could have the same name. A person can have any number of details initially, but all of their details have the same name.
In case 2 or more same email belongs to 2 or more different names merge with first name only. Return the 2D list in the order in a sorted way according to the name of the details.
Example:
Input: n: 4
details = [["John","johnsmith@mail.com","john_newyork@mail.com"], ["John","johnsmith@mail.com","john00@mail.com"], ["Mary","mary@mail.com"], ["John","johnnybravo@mail.com"]]
Output: [["John","john00@mail.com","john_newyork@mail.com", "johnsmith@mail.com"],["Mary","mary@mail.com"], ["John","johnnybravo@mail.com"]]
Explanation: The first and second John's are the same person as they have the common email "johnsmith@mail.com". The third John and Mary are different people as none of their email addresses are used by other accounts. We could return these lists in any order, for example the answer [['Mary', 'mary@mail.com'], ['John', 'johnnybravo@mail.com'], ['John', 'john00@mail.com', 'john_newyork@mail.com', 'johnsmith@mail.com']] would still be accepted.
Input: n: 5,
details = [["Gabe","Gabe0@m.co","Gabe3@m.co","Gabe1@m.co"],["Kevin","Kevin3@m.co","Kevin5@m.co","Kevin0@m.co"],["Ethan","Ethan5@m.co","Ethan4@m.co","Ethan0@m.co"],["Hanzo","Hanzo3@m.co","Hanzo1@m.co","Hanzo0@m.co"],["Fern","Fern5@m.co","Fern1@m.co","Fern0@m.co"]]Output: [["Ethan","Ethan0@m.co","Ethan4@m.co","Ethan5@m.co"],["Gabe","Gabe0@m.co","Gabe1@m.co","Gabe3@m.co"],["Hanzo","Hanzo0@m.co","Hanzo1@m.co","Hanzo3@m.co"],["Kevin","Kevin0@m.co","Kevin3@m.co","Kevin5@m.co"],["Fern","Fern0@m.co","Fern1@m.co","Fern5@m.co"]]
Explanation: We don't have any common emails in any of the users. We just sorted the emails of each person and we return a list of the emails.(The details can be returned in any order).
Approach:
The problem involves merging connected components (emails), making Disjoint Set Union (DSU) a natural choice for solving it. We use integer IDs to represent each connected component.. Initially, each account is mapped to a unique ID. We create a dictionary mapping an account index to itself. Iterating over emails in all accounts, we build a dictionary mapping email to the account index. If the same email appears multiple times, we perform a union operation to unite corresponding subsets under the same account index. Subsequently, we construct a dictionary mapping a merged account to its emails, utilizing the find operation to determine the final account index and appending associated emails. Finally, we compile the resulting list.
Steps-by-step approach:
Below is the implementation of the above approach:
John john00@mail.com john_newyork@mail.com johnsmith@mail.com Mary mary@mail.com John johnnybravo@mail.com
Time Complexity: O(n * a), where n is number of accounts or students and a is average number of emails per account.
Auxiliary Space: O(n * a)