婴儿名字

题目[Interview-1707]:典型并查集题目。

解题思路

首先对 names 这种傻 X 字符串结构进行预处理,转换为一个 mapkey 是名字,val 是名字出现的次数。

然后是把 synonyms 转换为并查集结构,需要注意的是:总是把字典序较小的名字作为连通分量的根。

最后以连通分量的根作为代表,计算每个连通分量的总权重(即每个名字的次数之和)。

代码实现

class Solution
{
public:
unordered_map<string, string> root;
vector<string> trulyMostPopular(vector<string> &names, vector<string> &synonyms)
{
vector<string> ans;
unordered_map<string, int> table;
for (auto &s : names)
{
int idx = s.find('(');
string n = s.substr(0, idx);
int val = stoi(s.substr(idx + 1, s.length() - 2 - idx));
table[n] = val;
}
// build the disjoint-union set
for (auto &str : synonyms)
{
int idx = str.find(',');
string n1 = str.substr(1, idx - 1);
string n2 = str.substr(idx + 1, str.length() - 2 - idx);
merge(n1, n2);
}
// calculate the frequency of root nodes
unordered_map<string, int> mapAns;
for (auto &p : table)
mapAns[find(p.first)] += p.second; for (auto &p : mapAns)
{
string s = p.first + "(" + to_string(p.second) + ")";
ans.emplace_back(s);
} return ans;
}
string find(string x)
{
return root.count(x) == 0 ? (x) : (root[x] = find(root[x]));
}
void merge(string x, string y)
{
x = find(x), y = find(y);
if (x < y)
root[y] = x;
else if (x > y)
root[x] = y;
// do nothing if x == y
}
};

冗余连接 Ⅱ

题目[685]:

最新文章

  1. 谈谈AppDelegate
  2. I am back-电商网站开发&amp;jQuery
  3. Maven系列二setting.xml 配置详解
  4. &amp;12-2 查找二叉搜索树
  5. js 判断一组日期是否是连续的
  6. 17-tail 简明笔记
  7. VS2012外接程序VMDebugger未能加载或导致了异常
  8. Oracle与MySQL的几点区别
  9. Visual Studio 2010 中的 Web 开发
  10. C++学习之友元类和友元函数
  11. Android常用开发工具的用法
  12. java去除查询实体字段多值之间空格
  13. 自学大数据(hadoop)小插曲__虚拟机工具
  14. mac环境破解navicat premium 12.1
  15. 源码阅读经验谈-slim,darknet,labelimg,caffe(1)
  16. Jenkins部署Python项目实战
  17. git 不区分文件大小写的处理
  18. mac终端不好用?用brew神器代替
  19. SAX vs. DOM (Event vs. Tree)
  20. C# 日志系统 log4net 配置及使用

热门文章

  1. oracle如何实现去重和分页
  2. while持续输入的几种常用使用方法
  3. JPA与hibernate-------JPA
  4. js数据类型很简单,却也不简单
  5. 风扇转速通过FPGA采样
  6. libevent到底是同步还是异步,是阻塞还是非阻塞
  7. select 标签的数据绑定
  8. 使用plupload实现多文件上传,自定义参数
  9. ArrayList详解-源码分析
  10. flask之CBV模式