面试题19:正则表达式匹配

题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。

思路:这道题需要全面考虑:因为*比较特殊,可以与他前面0个-多个同一字符匹配,因此需要根据情况对*的情况进行考虑,具体如下思维导图:


面试题19:正则表达式匹配_第1张图片
正则表达式匹配.png

代码实现:

# -*-coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串 利用递归实现
    def match(self, s, pattern):
        #特殊情况
        if len(s)==0 and len(pattern)==0:
            return True
        if (len(s)>0 and len(pattern)==0):
            return False
        # 1.第二个字符是*的情况
        if len(pattern)>1 and pattern[1]=='*':
            if len(s)>0 and (pattern[0]==s[0] or pattern[0]=='.'):  #模式匹配
                return self.match(s[1:],pattern) or self.match(s[1:],pattern[2:]) or self.match(s,pattern[2:])
            else:
                return self.match(s,pattern[2:])

        # 2. 第二个字符不是"*",包括只有一个字符的情况
        if (len(pattern)>1 and pattern[1]!='*') or len(pattern)==1:
            if len(s)>0 and (pattern[0]==s[0] or pattern[0]=='.'):
                return self.match(s[1:],pattern[1:])
            else:
                return False

s ="aaaa"
pattern = "a.a*"
print(Solution().match(s,pattern))

运行结果:

牛客网提交结果.png

你可能感兴趣的:(面试题19:正则表达式匹配)