递归方法

新手。讨论区大佬们直接上代码的多,看代码逆推思路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

力扣题解:44.通配符匹配
相似题(进阶):10.正则表达式匹配