給定一個列表 accounts,每個元素 accounts[i] 是一個字符串列表,其中第一個元素 accounts[i][0] 是 名稱 (name),其余元素是 emails 表示該賬戶的郵箱地址。
現在,我們想合并這些賬戶。如果兩個賬戶都有一些共同的郵箱地址,則兩個賬戶必定屬于同一個人。請注意,即使兩個賬戶具有相同的名稱,它們也可能屬于不同的人,因為人們可能具有相同的名稱。一個人最初可以擁有任意數量的賬戶,但其所有賬戶都具有相同的名稱。
合并賬戶后,按以下格式返回賬戶:每個賬戶的第一個元素是名稱,其余元素是按字符 ASCII 順序排列的郵箱地址。賬戶本身可以以任意順序返回。
示例 1:
輸入:
accounts = [[“John”, “johnsmith@mail.com”, “john00@mail.com”], [“John”, “johnnybravo@mail.com”], [“John”, “johnsmith@mail.com”, “john_newyork@mail.com”], [“Mary”, “mary@mail.com”]]
輸出:
[[“John”, ‘john00@mail.com’, ‘john_newyork@mail.com’, ‘johnsmith@mail.com’], [“John”, “johnnybravo@mail.com”], [“Mary”, “mary@mail.com”]]
解釋:
第一個和第三個 John 是同一個人,因為他們有共同的郵箱地址 “johnsmith@mail.com”。
第二個 John 和 Mary 是不同的人,因為他們的郵箱地址沒有被其他帳戶使用。
可以以任何順序返回這些列表,例如答案 [[‘Mary’,‘mary@mail.com’],[‘John’,‘johnnybravo@mail.com’],
[‘John’,‘john00@mail.com’,‘john_newyork@mail.com’,‘johnsmith@mail.com’]] 也是正確的。
代碼
class Solution {int[] fa;public void init(){for(int i=0;i<fa.length;i++)fa[i]=i;}public int find(int x){if(x!=fa[x])fa[x]=find(fa[x]);return fa[x];}public void union(int x,int y){x=find(x);y=find(y);if(x==y) return;fa[x]=y;}public List<List<String>> accountsMerge(List<List<String>> accounts) {Map<String,Integer> index=new HashMap<>();Map<Integer,String> name=new HashMap<>();int inx=0;for(List<String> list:accounts){String accName=list.get(0);for(int i=1;i<list.size();i++)if(!index.containsKey(list.get(i))) {//為每個郵箱地址創建下標和姓名映射name.put(inx,accName);index.put(list.get(i), inx++);}}fa=new int[inx];init();for(List<String> list:accounts)//將具有相同郵箱的 連接起來{int father=index.get(list.get(1));for(int i=2;i<list.size();i++)union(index.get(list.get(i)),father);}Map<Integer,List<String>> map=new HashMap<>();for(String s:index.keySet())//創建每個集合中 父節點下標 對 所有郵箱地址的映射{int fa=find(index.get(s));List<String> list=map.getOrDefault(fa,new ArrayList<>());list.add(s);map.put(fa,list);}List<List<String>> res=new ArrayList<>();for(int f:map.keySet())//按特定格式 寫入結果{List<String> temp=new ArrayList<>();List<String> email=map.get(f);Collections.sort(email);temp.add(name.get(f));temp.addAll(email);res.add(temp);}return res;}
}