给定一个字符串(s)和一个字符模式(p),实现一个支持'?''*'的通配符匹配。
'?'可以匹配任何单个字符。
'*'可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。

示例 1:

输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:
s = "aa"
p = "*"
输出: true
解释: '*' 可以匹配任意字符串。

示例 3:

输入:
s = "cb"
p = "?a"
输出: false
解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

示例 4:

输入:
s = "adceb"
p = "*a*b"
输出: true
解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".

示例 5:

输入:
s = "acdcb"
p = "a*c?b"
输出: false

(超时)解1 2021/9/7 O(?)

import re

def isMatch(s: str, p: str) -> bool:
    # 其实这题和第10题是一样的,只不过区别是,
    # '?'匹配任意单个字符,在标准正则中是'.'
    # '*'匹配任意个字符,在标准正则中是'.*'
    # 所以,把p中的'?','*'做下替换,就又可以用re了
    # 因为题目限制了s,p的字符范围,可以放心的替换
    ### 超时 - 1
    # 去掉p中连续2个以上的*
    p=re.sub(r'\*+',r'*',p)
    print(p)
    ### 超时 - 1
    p=p.replace('*','.*')
    p=p.replace('?','.')
    m=re.match(p,s)
    return True if (m and m.group()==s) else False

if __name__ == '__main__':
    '''
    print(isMatch('aa','a'))
    print(isMatch('aa','*'))
    print(isMatch('cb','?a'))
    print(isMatch('cb','?b'))
    print(isMatch('adceb','*a*b'))
    print(isMatch('acdcb','a*c?b'))
    ### 超时
    # 1
    print(isMatch('aaaabaaaabbbbaabbbaabbaababbabbaaaababaaabbbbbbaabbbabababbaaabaabaaaaaabbaabbbbaababbababaabbbaababbbba',
                  '*****b*aba***babaa*bbaba***a*aaba*b*aa**a*b**ba***a*a*'))
    # 简化后,很快
    #print(isMatch('aaaabaaaabbbbaabbbaabbaababbabbaaaababaaabbbbbbaabbbabababbaaabaabaaaaaabbaabbbbaababbababaabbbaababbbba',
    #              '*b*aba*babaa*bbaba*a*aaba*b*aa*a*b*ba*a*a*'))
    '''
    # 2
    print(isMatch('abbabaaabbabbaababbabbbbbabbbabbbabaaaaababababbbabababaabbababaabbbbbbaaaabababbbaabbbbaabbbbababababbaabbaababaabbbababababbbbaaabbbbbabaaaabbababbbbaababaabbababbbbbababbbabaaaaaaaabbbbbaabaaababaaaabb','**aa*****ba*a*bb**aa*ab****a*aaaaaa***a*aaaa**bbabb*b*b**aaaaaaaaa*a********ba*bbb***a*ba*bb*bb**a*b*bb'))

Leetcode - 44. 通配符匹配_字符串