一.题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
二.思路整理
情况比较复杂,下面一一列出:
(1)首先我使用的方法是递归实现,先列出一些边界条件:
当原字符串s为“”时,pattern为“”返回True
当原串s为“”,pattern不为“”,还是有可能匹配到的,比如s="",pattern=".*",这种我们放在主要的流程中考虑
当原串s不为“”,pattern为“”,这种情况明显匹配不上,返回False
当原串s和pattern都不为“”,这就是主要流程需要处理的情况
(2)下面是主要流程需要处理的情况:
分成两种,pattern中第二个字符是否为“*”,
当不为“*”时,我们判断len(s)是否大于0,当是否大于0确定后,还得判断pattern[0]和s[0]是否相等,还有pattern[0]是否为“.”,情况看起来比较复杂,其实我们只需要挑出可能会匹配到的情况,其他情况返回False就好了。可能会匹配到的情况就是:
len(s)>0且pattern[0]==s[0]或者pattern[0]==".",这时候下一个递归的起点就是s[1:]和pattern[1:]
其他情况是不可能匹配上的,自己可以列出来看看
当pattern中第二个字符为“*”时,还是列出可能会匹配到的情况就好了,
当len(s)==0时,不管pattern[0]为何值,pattern 都是跳两个再开始匹配
当len(s)>0时,pattern中的字符可以匹配s中的字符0次、一次或者多次
三.具体代码:
# -*- coding:utf-8 -*-
class Solution:
# s, pattern都是字符串
def match(self, s, pattern):
# write code here
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 (pattern[0] == '.' or pattern[0] == s[0])):
return self.match(s[1:], pattern[1:])
return False