高赞回答的详细注释版 (递归思维,从后向前)
字符串通配符
https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
def fun(s1, s2):
# 如果最终递归到2个字符都为空字符串,则为true
if s1 == '' and s2 == '':
return True
# 最终递归到s1为空,s2不为空,则为False
elif s1 == '' and s2 != '':
return False
# s1=='*' (*可替代0个字符),而s2为空,也为true
elif s1 != '' and s2 == '':
if s1.replace('*', '') == '':
return True
else:
return False
else:
m, n = len(s1), len(s2)
# 如果最后一个字符相同 或 s1最后一个字符为?,且s2由字母和数字组成(即s2最后一个字符可由?替代,s2[n-1].isalnum()也可)
if s1[m-1] == s2[n-1] or (s1[m-1]=='?' and s2.isalnum()): # .isalnum()检测字符串是否由字母和数字组成,
return fun(s1[:m-1], s2[:n-1])
elif s1[m-1] == '*':
# *替代0个字符 或 替代多个字符
return fun(s1[:m-1], s2) or fun(s1, s2[:n-1])
else:
return False
while True:
try:
# 不区分大小写
s1 = input().lower()
s2 = input().lower()
if fun(s1, s2):
print('true')
else:
print('false')
except:
break

