递归方法
新手。讨论区大佬们直接上代码的多,看代码逆推思路so吃力。
好在力扣上找到了详细思路(力扣第44题),梳理半天,终于敲出来了。记录如下:
匹配逻辑
从右向左识别符号,通配符p可能有三种类型:
1.普通字符
2.?
3.*
前两种情况可以合并为检查字符串s(n-2) 与通配符 p(m-2) 是否匹配。
第三种分为两个情形:
(1)无视* 字符串s(n-1) 与通配符 p(m-2) 是否匹配。
(2)考虑* 字符串s(n-2) 与通配符 p(m-1) 是否匹配。
边界条件
重中之重,这块也是我卡死两小时的真正原因。需要分别考虑字符串为空、通配符为空的情形。
(我觉得这个技能点属于经验型,新上手时不妨先背个例题,然后按使用场景优化。)
归纳如下:
1.字符串s='' 通配符 p='' 匹配结果为 True
2.字符串s!='' 通配符 p='' 匹配结果为 False
3.字符串s='' 通配符 p!='' 继续分两种情况:
(1) p里全是* 匹配结果为 True
(2) p里不全是* 匹配结果为 False
4.字符串与通配符均不为'',则需要开展比对,按三种开头梳理的三种类型分别设计检查判断
两个用例卡点
1.需要在通配符比对'?'环节 添加数字字母鉴别 str.isalnum()
2.需要在字母比对环节 添加字母统一转小写 str.lower()
class Solution:
def match(self, p:str, s:str) ->bool:
# 边界定义-各种单边或双边为空的情况
if s=='' and p=='':
return True
elif s!='' and p=='':
return False
elif s=='' :
if p.replace('*','')=='':
return True
else:
return False
# 字符串与通配符均不为空,递归检查
else:
n,m = len(s),len(p)
'''通配符是问号或者字母'''
if (p[m-1]=='?'and s[n-1].isalnum()) or p[m-1].lower()==s[n-1].lower():
return self.match(p[0:m-1],s[0:n-1])
'''通配符是星号'''
elif p[m-1]=='*':
return self.match(p[0:m-1],s) or self.match(p,s[0:n-1])
'''通配符不是问号或者字母,还跟字符串匹配不上'''
else:
return False
while True:
try:
p,s = input(),input()
s1 = Solution()
print('true' if s1.match(p,s) else 'false')
except:
break