给定一个字符串
(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'))