【华为机试】2023年真题B卷(python)-快速人名查找

一、题目

题目描述:

给一个字符串,表示用’, \’分开的人名。然后给定一个字符串,进行快速人名查找,符合要求的输出。
快速人名查找要求︰人名的每个单词的连续前几位能组成给定字符串,一定要用到每个单词。

二、输入输出

输入描述:
第一行是人名,用’, \’分开的人名 第二行是 查找字符串 
输出描述:

输出满足要求的人名

三、示例

示例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 combinations

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class UnionFind:
    def __init__(self, n=0):
        self.count = n
        self.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_root
            self.count -= 1


def 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 = query
            cz = 0
            
            for j in sorted(i):
                formatted_query = formatted_query[:j+cz] + ".*" + formatted_query[j+cz:]
                cz += 2
            formatted_query += ".*"
            
            if re.match("^" + pattern + ".*$", query) and re.match(formatted_query, name):
                result.append(name)
                break
    
    return result


# 读取输入的人名列表和查找字符串
names = input().split(",")
query = input()

# 输出满足要求的人名列表
matching_names = find_matching_names(names, query)

# 输出结果
print(",".join(matching_names))

你可能感兴趣的:(华为机试,华为,python,算法,华为机试,快速人名查找)