第一行输入一个长度为
、由可见字符构成的通配符字符串
。
第二行输入一个长度为
、由可见字符构成的目标字符串
。
如果可以匹配得到,输出
;否则,输出
。
z zz
false
Z* zz
true
在这个样例中,
匹配
。注意,由于不区分大小写,
可以匹配
。
?* zz
true
在这个样例中,
匹配
、
匹配
。
**Z 0QZz
true
在这个样例中,其中一种匹配方法是:
第一个
匹配
;
第二个
匹配
;
第三个
匹配
。
??** zz
true
可以匹配
个字符。
HH?* HH##1
false
可被
和
匹配的字符不包含
。
import sys def is_shuzihuozimu(cha): if "0" <= cha <= "9"&nbs***bsp;"a" <= cha <= "z": return True return False def str_match(obj_str, reg_str): if len(obj_str) != 0 and len(reg_str) == 0: return False elif len(obj_str) == 0 and len(reg_str) != 0: for reg_cha in reg_str: if reg_cha != "*": return False return True elif len(obj_str) == 0 and len(reg_str) == 0: return True else: cha = obj_str[0] reg_cha = reg_str[0] if cha == reg_cha: return str_match(obj_str[1:], reg_str[1:]) else: if reg_cha == "?": if is_shuzihuozimu(cha): return str_match(obj_str[1:], reg_str[1:]) else: return False if reg_cha == "*": if not is_shuzihuozimu(cha): return str_match(obj_str, reg_str[1:]) else: return any([str_match(obj_str, reg_str[1:]), str_match(obj_str[1:], reg_str)]) return False reg_line = input().lower() obj_line = input().lower() if str_match(obj_line, reg_line): print('true') else: print('false')为什么这样还超时啊. 我不理解
def foo(s1: str, s2: str) -> bool: l1, l2 = len(s1), len(s2) if l1 == 0 and l2 == 0: return True elif l1 == 0: return False elif l2 == 0: if s1 == "*" * l1: return True else: return False else: p1, p2 = 0, 0 while p1 < l1 and p2 < l2: if s1[p1] == "*": if s2[p2].isalnum(): return ( foo(s1[p1:], s2[p2 + 1 :]) &nbs***bsp;foo(s1[p1 + 1 :], s2[p2 + 1 :]) &nbs***bsp;foo(s1[p1 + 1 :], s2[p2:]) ) else: p1 += 1 continue elif s1[p1] == "?": if s2[p2].isalnum(): p1 += 1 p2 += 1 continue else: return False else: if s1[p1] == s2[p2]: p1 += 1 p2 += 1 continue else: return False if p1 == l1 and p2 < l2: return False elif p1 < l1 and p2 == l2: if len(s1[p1:].replace("*", "")) == 0: return True else: return False else: return True a, b = input().lower()[::-1], input().lower()[::-1] x = "true" if foo(a, b) else "false" print(x)
aa = "0"+input() bb = "0"+input() a = [] b = [] for i in range(len(aa)): if aa[i].isupper(): a.append(aa[i].lower()) else: a.append(aa[i]) for j in range(len(bb)): if bb[j].isupper(): b.append(bb[i].lower()) else: b.append(bb[j]) def pd(s): if s.islower(): return True elif s.isupper(): return True elif s in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]: return True else: return False def qu_xing(lst): # 使用列表推导式创建一个新列表,其中不包含'*'元素 return [item for item in lst if item != "*"] dp = [["0" for k in range(len(b)+1)] for i in range(len(a)+1)] dp[0][0] = "1" # 判断边缘 for i in range(1,len(a)): if qu_xing(a[0:i+1]) == ["0"]: dp[i][0] = "1" for i in range(1, len(a)): for j in range(1, len(b)): # 判断a的0~i和b的0~j是否匹配 if pd(b[j]): if a[i] == "*": if dp[i-1][j] == "1": dp[i][j] = "1" else: dp[i][j] = dp[i][j - 1] elif a[i] == "?": dp[i][j] = dp[i - 1][j - 1] elif a[i] == b[j]: dp[i][j] = dp[i - 1][j - 1] else: dp[i][j] = "0" elif a[i] == b[j]: dp[i][j] = dp[i - 1][j - 1] elif a[i] == "*": if dp[i - 1][j] == "1": dp[i][j] = "1" else: dp[i][j] = "0" else: dp[i][j] = "0" if dp[len(a) - 1][len(b) - 1] == "1": print("true") else: print("false")
import sys import re modStr = input().upper() mainStr = input().upper() while modStr.count("**")>0: modStr = modStr.replace("**","*") modStr = modStr.replace("?",r"[A-Z0-9]{1}") modStr = modStr.replace("*",r"[A-Z0-9]{0,}") modStr = modStr.replace(".",r"\.") #print(modStr) res = re.fullmatch(modStr,mainStr) if res==None: print("false") else: print("true")
import sys a = list(input().lower()) b = list(input().lower()) dp = [[0 for j in range(len(b)+1)] for i in range(len(a)+1)] dp[0][0] = True for i in range(1,len(a)+1): dp[i][0] = dp[i-1][0] and a[i-1]=='*' for i in range(1,len(a)+1): for j in range(1,len(b)+1): dp[0][j] = False if a[i-1]!='*': if a[i-1]==b[j-1]&nbs***bsp;(a[i-1]=='?' and b[j-1].isalnum()): dp[i][j]=dp[i-1][j-1] elif a[i-1]=='*': dp[i][j]=dp[i-1][j]&nbs***bsp;(b[j-1].isalnum() and dp[i][j-1]) if dp[len(a)][len(b)]: print('true') else: print('false')动态规划~
#发现大家和测试用例都有点没考虑到哈,当输入为h*?*和h#a#时, #返回仍然为true,不合理的,但我也没想到解决办法哈哈哈 def fun(str1, str2): if str1 == '' and str2 == '': return True elif str1 == '' and str2 != '': return False elif str1 != '' and str2 == '': if str1.replace('*', '') == '': return True else: return False else: m, n = len(str1), len(str2) if str1[m-1] == str2[n-1]&nbs***bsp;(str1[m-1] == '?' and str2[n-1].isalnum()): return fun(str1[:m-1], str2[:n-1]) elif str1[m-1] == '*': return fun(str1[:m-1], str2)&nbs***bsp;fun(str1, str2[:n-1]) else: return False while True: try: str1, str2 = input().lower(), input().lower() if fun(str1, str2): print('true') else: print('false') except: break
#思路:直接用正则的fullmatch匹配 #不行 #一是由于这里要求*?能直接匹配字符,而正则中是匹配前一项字符 #二是?在正则中匹配一次或0次,这里只能匹配一次 #三是用fullmatch匹配的话,会超时。可以用match匹配,看结果是否一致 #解决方法:将?替换为\w{1},将*替换为\w{0,},用match匹配,进行比较 import re model=input().replace('?','\w{1}').replace('*', '\w{0,}') text=input() flag=re.match(model,text,re.I) if flag==None&nbs***bsp;flag.group()!=text: print('false') else: print('true')
import re while True: try: a = input() b = input() a = a.lower() b = b.lower() a = a.replace('?','[0-9a-z]{1}').replace('*','[0-9a-z]*').replace('.','\.') #通配符变成正则表达 c = re.findall(a,b) if(b in c): print('true') else: print('false') except: break
import re while True: try: string1 = input().lower() string2 = input().lower() string1 = string1.replace('?', '[a-z0-9]').replace('.', '\.').replace('*', '[0-9a-z]*') stringRegex = re.compile(string1) if stringRegex.search(string2) and string2 == stringRegex.search(string2).group(): print('true') else: print('false') except: break