面试题 17.07. 婴儿名字
每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。给定两个列表,一个是名字及对应的频率,另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率。注意,如果 John 和 Jon 是相同的,并且 Jon 和 Johnny 相同,则 John 与 Johnny 也相同,即它们有传递和对称性。

在结果列表中,选择字典序最小的名字作为真实名字。

示例:
输入:names = [“John(15)”,“Jon(12)”,“Chris(13)”,“Kris(4)”,“Christopher(19)”], synonyms = ["(Jon,John)","(John,Johnny)","(Chris,Kris)","(Chris,Christopher)"]
输出:[“John(27)”,“Chris(36)”]

提示:
names.length <= 100000


代码:

class Solution {public:unordered_map<string,int> name_freq;unordered_map<string,string> pre;string find(string root){string son,tmp;son=root;while(root!=pre[root])  //找到父节点root=pre[root];while(son!=root)  //路径压缩{tmp=pre[son];pre[son]=root;son=tmp;}return root;}void join(string r1, string r2){if(pre.find(r1)==pre.end() || pre.find(r2)==pre.end())return;string p1=find(r1);string p2=find(r2);if(p1!=p2){            if(p1<p2){pre[p2]=p1;int tmp_freq=name_freq[p2];name_freq.erase(p2);name_freq[p1]+=tmp_freq;}else{pre[p1]=p2;int tmp_freq=name_freq[p1];name_freq.erase(p1);name_freq[p2]+=tmp_freq;}           }}vector<string> trulyMostPopular(vector<string>& names, vector<string>& synonyms){for (auto c : names){int ind = c.find('(');string tmp_name = c.substr(0, ind);int tmp_freq = stoi(c.substr(ind + 1, c.length() - ind - 2));name_freq[tmp_name] = tmp_freq;pre[tmp_name] = tmp_name;}for (auto c : synonyms){int ind = c.find(',');string tmp_name1 = c.substr(1, ind - 1);string tmp_name2 = c.substr(ind + 1, c.length() - ind - 2);join(tmp_name1, tmp_name2);}vector<string> res;for (auto it = name_freq.begin(); it != name_freq.end(); it++){string tmp_res = it->first + "(" + to_string(it->second) + ")";res.push_back(tmp_res);}return res;}
};

[LeetCode][C++]面试题 17.07. 婴儿名字/并查集相关推荐

  1. 面试题.17.07.婴儿名字--并查集

    LeetCode 面试题 17.07.婴儿名字 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被 ...

  2. LeetCode 面试题 17.07婴儿名字 (并查集+字符串处理+字典序)

    婴儿名字 1600ms,吐了 ,代码看似很长.但主要花在了字符串处理上. string s; s.substring(int idx,int len); //去除子串 stoi(string s); ...

  3. 面试题 17.07. 婴儿名字(并查集模板)

    难度中等33 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来.给定两个列 ...

  4. leetcode:面试题 17.07. 婴儿名字(并查集,代码超时了)

    题目: 分析: 并查集. 我用python写的, 1.创建一个二维列表,然后每个列表中的元素都只有一个,为每个名字. 2.查synonyms,匹配的名字对应的列表合并. 3.排序,求和. 竟然超时了, ...

  5. 并查集之面试题 17.07. 婴儿名字

    并查集之面试题 17.07. 婴儿名字 前言 一, 面试题 17.07. 婴儿名字 二,解题思路 1, a和b是朋友, b和c是朋友,那a和c也是朋友.这就是典型并查集类型 2, 字典序 3, 三, ...

  6. 面试题 17.07. 婴儿名字 ( 字符标志 并查集 )

    面试题 17.07. 婴儿名字 字符串并查集: 721. 账户合并 ( 并查集 ) 解题思路: 首先通过哈希表建立并查集,哈希表的键值对都是字符串,然后将一个相连的并查集合并: 利用一个哈希表进行计数 ...

  7. 面试题 17.07. 婴儿名字

    面试题 17.07. 婴儿名字 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公 ...

  8. 程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)

    1. 题目 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量. 有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来. 给定两个 ...

  9. leetcode面试题 17.07. 婴儿名字(并查集)

    每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来.给定两个列表,一个是名字 ...

最新文章

  1. 我平常整理了CString的一些用法,很实用,发给你共享,相信你以后遇到CString的问题都会迎刃而解:...
  2. WinCE 系统刚启动时运行应用,在应用启动时偶尔出现异常
  3. SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
  4. 数据接口同步的同步方法
  5. 线程的语法 (event,重要)
  6. 配置mysql为主主复制步骤
  7. HandlerInterceptor与MethodInterceptor
  8. windows 软件推荐
  9. weblogic12C安装
  10. diabetes影响因子2017_【重磅】2017 年内分泌领域 SCI 期刊影响因子出炉
  11. IT菜鸟最实用的网站,只要不造轮子,都能解决。
  12. Java 程序该怎么优化?(命令篇)
  13. Android CHM文件阅读器
  14. 关于Windows 7与Ubuntu启动的一些注记(win7屏蔽ubuntu的启动项)
  15. 这个微信小程序开源!
  16. 工业智能网关BL110应用之60:如何实现智能楼宇控制BACnet 接入阿里云平台
  17. rc列联表_R语言入门之频率表和列联表
  18. 美军如何在不可信设备上安全访问国防部网络?
  19. Shells:一款功能强大的反向Shell快速生成工具
  20. 24位嘉宾3大分论坛!粤港澳大湾区今年首场边缘计算大会全嘉宾公布!

热门文章

  1. 使用udig配置数据样式(三)——配置面图层样式
  2. 中国石油大学克拉玛依校区计算机类怎么样,中国石油大学克拉玛依校区,克拉玛依石油大学好吗?...
  3. 玩吃鸡台式计算机配置,2019年吃鸡电脑配置推荐,玩吃鸡的电脑要什么配置
  4. php哪些品牌,php虚拟主机哪个品牌的好
  5. 怎么把cad转换成pdf格式
  6. 许可证+实名制:政策铁拳打到网红更痛在平台
  7. Java Swing窗体编写——窗口创建思想
  8. JAVA不使用中间变量,实现两个数的交换
  9. opencv进行复数的乘除法运算
  10. windows XP 设置桌面大图标