class Solution(object):
def trulyMostPopular(self, names, synonyms):
# 检查是否是同一个父节点,返回父节点
def find(x):
if x != name_len[x]:
name_len[x] = find(name_len[x])
return name_len[x]
# 合并到同一个父节点
def union(x1, x2):
res1 = find(name2len[x1])
res2 = find(name2len[x2])
if len2name[res1] > len2name[res2]:
name_len[res1] = res2
else:
name_len[res2] = res1
name_cnt = len(names)
name = [s[:s.find('(')] for s in names]
name_len = [i for i in range(len(name))] # 初始化并查集,初始化其下标为的父节点
name2len = dict(zip(name, name_len)) # 名字:名字长度
len2name = dict(zip(name_len, name)) # 名字长度:名字
for pair in synonyms:
pair = pair[1:-1].split(',')
# 若第一个名字在字典中没有找到,则进行添加记录,表示添加一个新的名字
if name2len.get(pair[0], -1) == -1:
name2len[pair[0]] = name_cnt # 在name2len中添加记录
len2name[name_cnt] = pair[0] # 在len2name中添加记录
name_len.append(name_cnt) # 在name_len中添加长度记录
name_cnt += 1 # 已有的名字数量加一
# 若第二个名字在字典中没有找到,同上
if name2len.get(pair[1], -1) == -1:
name2len[pair[1]] = name_cnt
len2name[name_cnt] = pair[1]
name_len.append(name_cnt)
name_cnt += 1
union(pair[0], pair[1]) # 添加完之后,把他们合并到同一个父节点下
res = {}
for name in names:
idx = name.find('(')
nam, name_cnt = name[:idx], int(name[idx+1:-1])
fa = len2name[find(name2len[nam])]
res[fa] = res.get(fa, 0) + name_cnt # 累加同一个父节点下的数量
return [key + '(' + str(val) + ')' for key, val in res.items()]
面试题 17.07. 婴儿名字(Medium)
最新推荐文章于 2024-06-16 16:27:55 发布