第一行输入一个长度为
、由可见字符构成的通配符字符串
。
第二行输入一个长度为
、由可见字符构成的目标字符串
。
如果可以匹配得到,输出
;否则,输出
。
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