题目链接:https://leetcode-cn.com/problems/baby-names-lcci/
分析题意可以知道这是个并查集,新增一个size数目来维护集合数量大小就可以了(size数组只有当是父节点时才有意义)
思路:将synonyms中的相同的名字合并即可,但是names的处理就比较麻烦,对于John(15)这样一个字符串,要分离出John和15这两个字符串。同时还有一个要注意点,并查集merge的时候要注意如果find的值相同(是同一个集合的),是不需要重复加的。

class Solution:def trulyMostPopular(self, names: List[str], synonyms: List[str]) -> List[str]:# initself.p = list(range(0, len(names)+100, 1))self.size = [0] * (len(names)+100);self.name_index_dic = {}for i in range(len(names)):name = names[i]index= name.find('(')name_size = name[index+1:-1]name = name[:index]self.name_index_dic[name] = iself.size[self.name_index_dic[name]] = int(name_size)names[i] = nameidx = len(names)# 合并for synonym in synonyms:index = synonym.find(',')name1 = synonym[1:index]name2 = synonym[index+1:-1]name1_id = self.name_index_dic.get(synonym[1:index])name2_id = self.name_index_dic.get(synonym[index+1:-1])if name1_id == None:self.name_index_dic[name1] = idxnames.append(name1)name1_id = idxidx += 1if name2_id == None:self.name_index_dic[name2] = idxnames.append(name2)name2_id = idxidx += 1# print(str(name1_id)+" "+str(name2_id))self.__merge(name1_id, name2_id)# 路径压缩for i in range(len(names)):self.__find(i)# 得到字典序最小的名字index_name_dict = {}for i in range(len(names)):if index_name_dict.__contains__(self.p[i]):now = index_name_dict.get(self.p[i])if names[i] < now:index_name_dict[self.p[i]] = names[i]else:index_name_dict[self.p[i]] = names[i];# 组装答案ans = []for key in index_name_dict:s = index_name_dict[key] + "(" + str(self.size[key]) + ")"ans.append(s)# print(self.p)return ansp = []size = []name_index_dic = {}def __find(self, x : int):if x != self.p[x]:self.p[x] = self.__find(self.p[x])return self.p[x]def __merge(self, a : int, b : int):a = self.__find(a)b = self.__find(b)if a != b:self.p[a] = b;self.size[b] += self.size[a]

leecode 面试题 17.07 婴儿名字相关推荐

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

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

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

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

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

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

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

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

  5. 面试题 17.07. 婴儿名字

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

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

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

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

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

  8. 程序员面试金典 - 面试题 17.07. 婴儿名字

    题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 每年,政府都会公布一万个最常见的婴 ...

  9. [Leetcode 每日精选](本周主题-并查集) 面试题 17.07. 婴儿名字

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题多了一些变化, 但核心仍然是并查集. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到该系列当前已 ...

最新文章

  1. Linux运行脚手架vue,【Vue】Vue-cli 搭建 脚手架
  2. Android Studio实用插件使用
  3. 不同时间段的欢迎语言
  4. 深度学习笔记:Tensorflow手写mnist数字识别
  5. 如何处理错误信息 Pricing procedure could not be determined
  6. 双网卡绑定linux7.2,CentOS 7.2 bond实现网卡聚合链路(双网卡绑定)脚本及验证(适合云平台)...
  7. Linux卸载/删除多余网卡
  8. 华为一所英国研发中心建设项目获当地批准 计划总投资4亿英镑
  9. 小鹏汽车遭多地车主维权 要求退车 孙宇晨:个人拿1000万支持维权
  10. 转载:互联网盈利模式
  11. 通过表面分析评估 Cu-CMP 工艺
  12. vue3 provide和 reject
  13. S3C2440裸机开发----点亮LED
  14. js获取当前域名的方法
  15. linux 程序被Killed,查看原因
  16. 2020.08.11 【ABAP随笔】-ITS Mobile 配置
  17. VR购物之初体验:Buy+
  18. 哈工大数据库系统(上):嵌入式SQL语言之动态SQL(十)课后测验与作业
  19. 猪八戒威客网对我的报道
  20. 【AI实时变声器,声音甜甜的小姐姐背后竟是抠脚大汉】

热门文章

  1. 使用for循环语句计算8+88+888+···前十项之和
  2. 高通 OpenXR SDK 使用指南(1)
  3. python多项式拟合_最小二乘法—多项式拟合非线性函数
  4. Git分布式版本控制和远程库创建运用、git常用指令【尚硅谷笔记】
  5. [转]智能扫描仪可准确辨识瓶中液体
  6. 商业研究(21):活力蛙,足疗O2O,曾经的“中国上门足疗领先品牌”
  7. 随机网络中的孤立点(片)处理
  8. 罗马复兴开源代码_社区主导的开源复兴
  9. ELECON 轻松掌握 洁净电力
  10. 云计算浅谈之三:微软云计算服务介绍