解题思路: 字符串匹配
- 正则中无*号,直接匹配长度,长度一致再匹配内容
- 正则中只有*号,直接返回True
- 正则中有号也有其他符号,按号切割
注意的点:
1. 正则头和尾有的情况和无号的情况,需要单独考虑
2. 判断两个字符串相等(细节 "?"号 只能匹配字母和数字)
# -*- coding: utf-8 -*- # 开发者 : QSheng # 代码文件 : HJ71 字符串通配符.py # 创建时间 : 2021/7/28 11:13 class Solution(): def __is_equal(self, str_1, str_2): for ch_1, ch_2 in zip(list(str_1), list(str_2)): if (ch_1 == "?" and (str(ch_2).isalpha() or str(ch_2).isdigit())) or ch_1 == ch_2: continue else: return False return True def __find_str(self, i, reg_str_ch, str_ch, str_ch_len): rnt = -1 reg_str_ch_len = len(reg_str_ch) for i in range(i, str_ch_len - reg_str_ch_len + 1): if self.__is_equal(reg_str_ch, str_ch[i:i+reg_str_ch_len]): rnt = i+reg_str_ch_len break return rnt def solve(self, line_reg, line_str): """ 字符串匹配 1. 无*号,直接匹配 2. 只有*号,直接返回true 3. 有*号,就按*号切割 头部无*号处理 尾部无*号处理 :param line_reg: :param line_str: :return: """ # 1. 无*号,直接匹配 if "*" not in line_reg: if len(line_reg) != len(line_str): return False return self.__is_equal(line_reg, line_str) # 2、只有*号,直接返回true if "*" == "".join(set(list(line_reg))): return True # 3. 有*号,就按*号切割 reg_list = line_reg.split("*") # 头部无*号处理 if line_reg[0] != "*": if self.__is_equal(reg_list[0], line_str[0:len(reg_list[0])]) is False: return False # 去除头部字符串,去除头部正则 line_str = line_str[len(reg_list[0]):] reg_list = reg_list[1:] # 尾部无*号处理 if line_reg[-1] != "*": if self.__is_equal(reg_list[-1], line_str[len(line_str) - len(reg_list[-1]):]) is False: return False # 去除尾部字符串,去除尾部正则 line_str = line_str[:len(line_str) - len(reg_list[-1])] reg_list = reg_list[:-1] # 中间部分 start_i = 0 reg_str_list_len = len(reg_list) str_ch_len = len(line_str) for reg_idx in range(reg_str_list_len): if len(reg_list[reg_idx]) == 0: continue # 每个子串匹配主串,并拿到终点下标 start_i = self.__find_str(start_i, reg_list[reg_idx], line_str, str_ch_len) if start_i == -1: return False return True import sys if __name__ == '__main__': is_IDE = False if is_IDE: fr = open("data/HJ71.txt", "r", encoding="utf-8") else: fr = sys.stdin while True: line_reg = fr.readline().strip() if line_reg == "": break line_str = fr.readline().strip() rnt = Solution().solve(line_reg.lower(), line_str.lower()) print("true" if rnt else "false") if is_IDE: fr.close()