每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,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)”]

代码

class Solution {int[] strFa;public void  strInit()//并查集操作{for(int i=0;i<strFa.length;i++)strFa[i]=i;}public int  strFind(int x){if(x!=strFa[x])strFa[x]=strFind(strFa[x]);return strFa[x];}public void   strUnion(int x,int y){x=strFind(x);y=strFind(y);if(x==y) return;if(map.get(y).compareTo(map.get(strFa[x]))<0)//按字典序确定父节点strFa[x]=y;else strFa[y]=x;}  Map<Integer,String>map=new HashMap<>();public String[] trulyMostPopular(String[] names, String[] synonyms) {int n=names.length;strFa=new int[n];strInit();Map<String,Integer>map2=new HashMap<>(); int[] res=new int[n];for(int i=0;i<n;i++)//将名字和对应的编号用map记录{String[] name=names[i].split("[()]");map.put(i,name[0]);map2.put(name[0],i);res[i]=Integer.parseInt(name[1]);}List<String> list=new ArrayList<>();for(String s:synonyms)//构建并查集{String name1=s.substring(1,s.indexOf(','));String name2=s.substring(s.indexOf(',')+1,s.length()-1);if(map2.containsKey(name1)&&map2.containsKey(name2))strUnion(map2.get(name1),map2.get(name2));}for(int i=0;i<n;i++)//将子节点的值累加到父节点{if(strFa[i]!=i) res[strFind(i)]+=res[i];}for(int i=0;i<n;i++)//返回所有的不相交的父节点if(strFa[i]==i){list.add(map.get(i)+'('+res[i]+')');}String[] ret=new String[list.size()];for(int i=0;i<list.size();i++)ret[i]=list.get(i);return ret;}
}

leetcode面试题 17.07. 婴儿名字(并查集)相关推荐

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

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

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

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

  3. [LeetCode][C++]面试题 17.07. 婴儿名字/并查集

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

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

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

  5. LeetCode 面试题 17.07. 婴儿名字

    难度:中等. 标签:并查集,深度优先搜索,广度优先搜索. 这个题思路不难想到,就是很复杂. 需要注意的两个点: 用例中的names可能出现重复的名字,比如下面的用例,出现了两个Jon,第二个Jon的值 ...

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

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

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

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

  8. 面试题 17.07. 婴儿名字

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

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

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

最新文章

  1. 最大公约数 数学,结论 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
  2. Matlab 预防性维修,使用 MATLAB 进行预测性维护简介
  3. 对PostgreSQL的 ctid 的初步认识
  4. POJ - 2175 Evacuation Plan(最小费用最大流+消圈定理)
  5. linux内核那些事之mmap
  6. 罗永浩推出新一代坚果手机,比AI亮眼的是AV能力
  7. QT之tableWidget删除全部行
  8. linux 安装多版本jdk
  9. 详解Nginx Rewrite标记last和break的区别
  10. 如何给文件添加everyone权限
  11. sonar打包出现的问题The forked VM terminated without saying properly goodbye. VM crash or System.exit called
  12. 获取Android手机设备的IMSI / IMEI 信息
  13. 有哪些权威的职业性格测试?职业性格测试靠谱吗?
  14. HTML---一个没有下划线字体颜色为黑色的链接
  15. Hive ,Hsql行转列、列转行实现
  16. PyQt5-五十音图听写
  17. Java实现语音朗读电子书
  18. 软件测试质量体系管控
  19. 200228批量导入开票接口出错,用另外一种方式解决,快速开票顺畅
  20. 2012搜狗校园招聘笔试题(1)

热门文章

  1. GDB调试教程:1小时玩转Linux gdb命令
  2. Java框架体系架构的知识,轻松拿下offer
  3. php 常用正则运算
  4. 无法获取 vmci 驱动程序版本: 句柄无效
  5. java线程并发库之--线程同步工具CountDownLatch用法
  6. [Linux]几个armhf的ubuntu源
  7. 基础拾遗------webservice详解
  8. android的progressDialog 的使用。android数据异步加载 对话框提示
  9. iOS应用开发视频教程笔记(二)My First iOS App
  10. [zz]从HDFS看分布式文件系统的设计需求