721. 账户合并
题目链接:721. 账户合并
代码如下:
//参考链接:https://leetcode.cn/problems/accounts-merge/solutions/564305/zhang-hu-he-bing-by-leetcode-solution-3dyq
class UnionFind
{
public:
vector<int> parent;
UnionFind(int n)
{
parent.resize(n);
for(int i=0;i<n;i++)
{
parent[i]=i;
}
}
void unionSet(int index1,int index2)
{
parent[find(index2)]=find(index1);
}
int find(int index)
{
if(parent[index]!=index) {parent[index]=find(parent[index]);}
return parent[index];
}
};
class Solution
{
public:
vector<vector<string>> accountsMerge(vector<vector<string>>& accounts)
{
map<string,int> emailToIndex;
map<string,string> emailToName;
int emailsCount=0;
for(auto& account:accounts)
{
string& name=account[0];
for(int i=1;i<account.size();i++)
{
string& email=account[i];
if(!emailToIndex.count(email))
{
emailToIndex[email]=emailsCount++;
emailToName[email]=name;
}
}
}
UnionFind uf(emailsCount);
for(auto& account:accounts)
{
string& firstEmail=account[1];
int firstIndex=emailToIndex[firstEmail];
for(int i=2;i<account.size();i++)
{
string& nextEmail=account[i];
int nextIndex=emailToIndex[nextEmail];
uf.unionSet(firstIndex,nextIndex);
}
}
map<int,vector<string>> indexToEmails;
for(auto& [email,_]:emailToIndex)
{
int index=uf.find(emailToIndex[email]);
vector<string>& account=indexToEmails[index];
account.emplace_back(email);
indexToEmails[index]=account;
}
vector<vector<string>> res;
for(auto& [_,emails]:indexToEmails)
{
sort(emails.begin(),emails.end());
string& name=emailToName[emails[0]];
vector<string> account;
account.emplace_back(name);
for(auto& email:emails)
{
account.emplace_back(email);
}
res.emplace_back(account);
}
return res;
}
};