Implement wildcard pattern matching with support for '?'
and '*'
.
'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false
Show Similar Problems
Have you met this question in a real interview?
Yes
No
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
s_i = 0
p_i = 0
s_len = len(s)
p_len = len(p)
star = -1
sstar = 0
while s_i < s_len:
# match exactly the same or p is '?'
if p_i < p_len and (s[s_i] == p[p_i] or p[p_i] == '?'):
p_i += 1
s_i += 1
# get the first position of '*' keep comparing until p is not '*'
elif p_i < p_len and p[p_i] == '*':
star = p_i
p_i += 1
sstar = s_i
# get the position p is not '*'
elif star != -1:
p_i = star + 1
sstar += 1
s_i = sstar
else:
return False
while p_i < p_len and p[p_i] == '*':
p_i += 1
if p_i == p_len:
return True
return False