一、题目
题目描述:
给一个字符串,表示用’, \’分开的人名。然后给定一个字符串,进行快速人名查找,符合要求的输出。
快速人名查找要求︰人名的每个单词的连续前几位能组成给定字符串,一定要用到每个单词。
二、输入输出
输入描述:
第一行是人名,用’, \’分开的人名 第二行是 查找字符串
输出描述:输出满足要求的人名
三、示例
示例1:
输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
zhang san,zhang san san
zs
输出:
zhang san
示例2:输入输出示例仅供调试,后台判题数据一般不包含示例
输入
zhang san san,zhang an sa,zhang hang,zhang seng,zhang sen a
zhas
输出
zhang an sa,zhang seng
四、要求
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
五、解题思路
使用正则表达式进行匹配
六、参考代码
# -*- coding: utf-8 -*-
'''
@File : 2023-B-快速人名查找.py
@Time : 2024/01/01 00:23:18
@Author : mgc
@Version : 1.0
@Desc : None
'''import re
from itertools import combinationsclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass UnionFind:def __init__(self, n=0):self.count = nself.item = [i for i in range(n+1)]def find(self, x):if x != self.item[x]:self.item[x] = self.find(self.item[x])return self.item[x]def union(self, x, y):x_root = self.find(x)y_root = self.find(y)if x_root != y_root:self.item[y_root] = x_rootself.count -= 1def find_matching_names(names, query):result = []for name in names:pattern = ".*".join([i[0] for i in name.split(" ")])insert_add_list = list(combinations([i for i in range(1, len(query))], len(name.split(" ")) - 1))for i in insert_add_list:formatted_query = querycz = 0for j in sorted(i):formatted_query = formatted_query[:j+cz] + ".*" + formatted_query[j+cz:]cz += 2formatted_query += ".*"if re.match("^" + pattern + ".*$", query) and re.match(formatted_query, name):result.append(name)breakreturn result# 读取输入的人名列表和查找字符串
names = input().split(",")
query = input()# 输出满足要求的人名列表
matching_names = find_matching_names(names, query)# 输出结果
print(",".join(matching_names))