[LeetCode][C++]面试题 17.07. 婴儿名字/并查集
面试题 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. 婴儿名字/并查集相关推荐
- 面试题.17.07.婴儿名字--并查集
LeetCode 面试题 17.07.婴儿名字 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被 ...
- LeetCode 面试题 17.07婴儿名字 (并查集+字符串处理+字典序)
婴儿名字 1600ms,吐了 ,代码看似很长.但主要花在了字符串处理上. string s; s.substring(int idx,int len); //去除子串 stoi(string s); ...
- 面试题 17.07. 婴儿名字(并查集模板)
难度中等33 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来.给定两个列 ...
- leetcode:面试题 17.07. 婴儿名字(并查集,代码超时了)
题目: 分析: 并查集. 我用python写的, 1.创建一个二维列表,然后每个列表中的元素都只有一个,为每个名字. 2.查synonyms,匹配的名字对应的列表合并. 3.排序,求和. 竟然超时了, ...
- 并查集之面试题 17.07. 婴儿名字
并查集之面试题 17.07. 婴儿名字 前言 一, 面试题 17.07. 婴儿名字 二,解题思路 1, a和b是朋友, b和c是朋友,那a和c也是朋友.这就是典型并查集类型 2, 字典序 3, 三, ...
- 面试题 17.07. 婴儿名字 ( 字符标志 并查集 )
面试题 17.07. 婴儿名字 字符串并查集: 721. 账户合并 ( 并查集 ) 解题思路: 首先通过哈希表建立并查集,哈希表的键值对都是字符串,然后将一个相连的并查集合并: 利用一个哈希表进行计数 ...
- 面试题 17.07. 婴儿名字
面试题 17.07. 婴儿名字 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公 ...
- 程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)
1. 题目 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量. 有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来. 给定两个 ...
- leetcode面试题 17.07. 婴儿名字(并查集)
每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量.有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来.给定两个列表,一个是名字 ...
最新文章
- 我平常整理了CString的一些用法,很实用,发给你共享,相信你以后遇到CString的问题都会迎刃而解:...
- WinCE 系统刚启动时运行应用,在应用启动时偶尔出现异常
- SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
- 数据接口同步的同步方法
- 线程的语法 (event,重要)
- 配置mysql为主主复制步骤
- HandlerInterceptor与MethodInterceptor
- windows 软件推荐
- weblogic12C安装
- diabetes影响因子2017_【重磅】2017 年内分泌领域 SCI 期刊影响因子出炉
- IT菜鸟最实用的网站,只要不造轮子,都能解决。
- Java 程序该怎么优化?(命令篇)
- Android CHM文件阅读器
- 关于Windows 7与Ubuntu启动的一些注记(win7屏蔽ubuntu的启动项)
- 这个微信小程序开源!
- 工业智能网关BL110应用之60:如何实现智能楼宇控制BACnet 接入阿里云平台
- rc列联表_R语言入门之频率表和列联表
- 美军如何在不可信设备上安全访问国防部网络?
- Shells:一款功能强大的反向Shell快速生成工具
- 24位嘉宾3大分论坛!粤港澳大湾区今年首场边缘计算大会全嘉宾公布!