Implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
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", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
Subscribe to see which companies asked this question
下面注释掉的做法是用正则表达式
当然了,要用回溯,或者动态规划
这个还是很有意思的一道题。。。
class Solution(object):
cache = {}
def isMatch(self, s, p):
if (s,p) in self.cache:
return self.cache[(s,p)]
#print s,p
ls = len(s)
lp = len(p)
if lp == 0:#p到头了
self.cache[(s,p)] = (ls == 0)
return ls == 0
elif ls == 0:# now lp > 0,s到头了
if lp > 1 and p[1] == '*':
self.cache[(s,p)] = self.isMatch(s,p[2:])#??
return self.cache[(s,p)]
else:
self.cache[(s,p)] = False
return False
elif lp > 1 and p[1] == '*':
if self.isMatch(s,p[2:]):
self.cache[(s,p)] = True
return True
elif s[0] == p[0] or p[0] == '.':
self.cache[(s,p)] = self.isMatch(s[1:],p)
return self.cache[(s,p)]
else:
self.cache[(s,p)] = False
return False
else:
return (s[0] == p[0] or p[0] == '.') and self.isMatch(s[1:],p[1:])
'''
r = re.compile(p)
m = r.match(s)
if not m:
return False
if m.end()-m.start() == len(s):
return True
return False
'''
"""
:type s: str
:type p: str
:rtype: bool
"""