思路:
最核心的地方在于如何合并?这里是通过具有相同的email进行账户的合并,这个相同的email类似于图中的共同节点将两个账户连接起来,所以将原来
账户名 -> 邮件1 邮件2.。。变成hash
邮件1 ->账户id1,账户id2。。
方便进行具有相同邮件的账户id进行合并,合并成一个新的mergedaccount再sort一下保存即可。
代码:
class Solution {
public:
// 原本给的是 用户名1 邮箱1 邮箱2 ...
// 这里类似于邮箱作为连接节点, 邮箱1 用户1 用户2 ...(深度搜索合并起来)-->变这样存储
vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
int n = accounts.size();
unordered_map<string, vector<int>> mp;
for(int i = 0; i < accounts.size(); i ++)
for(int j = 1; j < accounts[i].size(); j ++)
mp[accounts[i][j]].push_back(i); // 映射到账户记录上
vector<bool> st(n, false); // 访问过的账户状态数组
unordered_set<string> cur_emails; // 当前账户的所有emails集合
// 定义匿名函数dfs
function<void(int)> dfs = [&](int u) -> void {
st[u] = true; // 打上访问过的标记
for(int i = 1; i < accounts[u].size(); i ++){
const string& t = accounts[u][i];
if(cur_emails.count(t) == 0){ // 没加过才需要加入
cur_emails.insert(t);
// 查询拥有此email的其他账户的邮箱信息
for(int idx: mp[t])
if(!st[idx]) dfs(idx);
}
}
};
vector<vector<string>> mergedAccount;
for(int i = 0; i < n; i ++){
if(st[i]) continue; // 深搜后的账户记得跳过
cur_emails.clear(); // 每次进入dfs前记得清空
dfs(i); // 得到结果cur_emails
vector<string> t; // 合并后的记录
t.push_back(accounts[i][0]); // 先插入第一个元素, 名字
t.insert(t.end(), cur_emails.begin(), cur_emails.end());
// 在t的末尾依次插入cur_emails的每一个元素
sort(t.begin() + 1, t.end());
mergedAccount.push_back(t);
}
return mergedAccount;
}
};
其他:
①匿名函数的使用: