【华为OD考试真题】快速人名查找【Python版】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 题目
  • 一、题目正文
  • 参考题解
  • 一、分析
  • 二、代码


题目

标题:
分值: 200 ’

一、题目正文

【华为OD考试真题】快速人名查找【Python版】_第1张图片
输入
zhang san,zhang san san
zhansa
输出
zhang san
输入
zhang san,zhang san san
zhaansas
输出
“”
输入
zhang san,zhang san san
zhansas
输出
zhang san san


参考题解

一、分析

本题使用正则表达式相对简单点,中心思想就是:使用正则表达式中的表达式".“(作用:匹配任意长度的字母数字字符串)将匹配式query分割成和姓名字数一致的几部分,如果分割后 的表达式中的某个能和当前姓名匹配,并且姓名的首字母以”."分割后也能和query匹配,那当前姓名就是查找到的姓名中的一个

二、代码

时间复杂度:O(n*n!)
空间复杂度:O(n)

from itertools import combinations
from re import match

names = input().split(",")
query = input()
n_list = []
for name in names:
    xm_list = name.split()  # 将姓名分割
    len_name = len(xm_list)
    first_s = ".*".join([i[0] for i in xm_list]) #首字母的匹配式
    # query 中插入匹配任意长度字符串的表达式".*"的位置
    insert_add_list = list(combinations([i for i in range(1, len(query))], len_name - 1))
    for i in insert_add_list:
        query_s = query
        cz = 0
        for j in sorted(i):
            query_s = query_s[:j+cz] + ".*" + query_s[j+cz:]
            cz += 2
        query_s += ".*"
        if match("^" + first_s + ".*$", query) and match(query_s, name):
            n_list.append(name)
print("".join(n_list))

你可能感兴趣的:(华为OD机试题【Python】,python,算法)