【剑指Offer_12】正则表达式匹配☆(递归匹配)

题目描述

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

 递归的思想。

# -*- coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        # s和p都为空,两个空串一定匹配;
        if s == "" and pattern == "":
            return True
        # p为空,一定不匹配;
        elif s != "" and pattern == "":
            return False
        # s为空,就要检查p了,如果p是a*b*c*形式的,则p可以转化成空串;
        elif s == "" and pattern != "":
            # 如果p长度大于2,并且p[1]是个*,才能符合上面可以变成空串的形式;
            if len(pattern) >= 2 and pattern[1] == '*':
                # 继续递归检查p[2:]后面的是否符合;
                return self.match(s, pattern[2:])
            else:
                return False
        
        if len(pattern) >=2 and pattern[1] == '*':
            # 第一个元素匹配成功,有三种继续进行的选择,都要尝试一下;
            if s[0] == pattern[0] or pattern[0] == '.':
                # 第一种是为了防止 s="bbba", p=".*a"这种情况,这个我们一看就是匹配的;
                # 但是它有可能一个".*"就把"bbba"都匹配掉了,p剩下个"a",会认为匹配失败。
                # 第二种是匹配成功,并且s、p都移动;
                # 第三种是,s移动,p的*留着。
                return self.match(s, pattern[2:]) or self.match(s[1:], pattern[2:]) or self.match(s[1:], pattern)
            # 如果第一个元素匹配失败,p后移2个,相当于(*=0)
            else:
                return self.match(s, pattern[2:])
        # 没有*的情况,直接匹配第一个元素看是否成功;
        elif s[0] == pattern[0] or pattern[0] == '.':
            return self.match(s[1:], pattern[1:])
        else:
            return False
                

猜你喜欢

转载自blog.csdn.net/Vici__/article/details/104487813