[LeetCode]44 通配符匹配

题目描述

给定一个字符串 (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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution:
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
s_left = p_left = 0
s_right = len(s) - 1
p_right = len(p) - 1
last_star = -1
last_match = 0
star = 0

while p_right >= p_left:
if (s_right >= s_left) and (p[p_right] == '?' or p[p_right] == s[s_right]):
p_right -= 1
s_right -= 1
elif p[p_right] == '*':
p_right -= 1
star = 1
break
else:
return False

if star == 1 and p_right< p_left:
return True
elif star == 0 and s_right >= s_left:
return False

while p_left <= p_right:
if (s_left <= s_right) and (p[p_left]=='?' or p[p_left]==s[s_left]):
p_left += 1
s_left += 1
elif p[p_left] == '*':
last_star = p_left
last_match = s_left
p_left += 1
elif last_star == -1 or s_left >= s_right:
return False
else:
last_match += 1
s_left = last_match
p_left = last_star + 1
return True