【题目】请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"aba"均不匹配
【思路】本题采用递归的方法逐个比对字符串和模式中字符,首先分成两种情况,看第二个字符是不是’*’。)当第二个字符不是’*‘时:
(1)判断字符串第一个字符和模式的第一个字符是否相等(注意:模式第一个字符为’.‘也可以匹配),若相等,则比较字符串和模式的下一个字符;
(2) 如果第一个字符不相等,返回False。
当第二个字符是’*'时,首先看第一个字符是否匹配,若不匹配,则模式后移两个字符(此时的*表示前一个字符次数为0),如果第一个字符匹配则分以下情况:
- 字符串不变,模式向后移动两字符(相当于x*被忽略)
- 字符串往后移一位,模式往后移两字符
- 字符串往后移一位,模式不变(因为*可以匹配多次)
注意,判断边界条件时判断字符串长度为空而不是判断字符串为空,因为不断移位最后是一个空的字符串,而是None;即:
if len(s) == 0:
而不是if s == None:
【代码】
def match(self, s, pattern):
# write code here
#s可能为空,且只包含从a-z的小写字母
#p可能为空,且只包含从a-z的小写字母以及字母"."和"*"
if (len(s) == 0 and len(pattern) == 0):
return True
if (len(s) > 0 and len(pattern) == 0):
return False
if len(pattern)>1 and pattern[1] == '*':
if (len(s) > 0 and (s[0] == pattern[0] or pattern[0] == '.')):
return (self.match(s,pattern[2:]) or
self.match(s[1:], pattern[2:]) or
self.match(s[1:], pattern))
else:
return self.match(s,pattern[2:])
if (len(s) > 0 and (s[0] == pattern[0] or pattern[0] == '.')):
return self.match(s[1:], pattern[1:])
return False