LeetCode : No10 Regular Expression Matching

本文介绍了一种通过递归方式实现正则表达式匹配的技术,特别关注了'.'和'*'符号的用法,以及如何处理包含'*'的特殊情况。此外,文章还提供了一个简化正则表达式的程序,提高了匹配效率。

题目链接:

https://leetcode.com/problems/regular-expression-matching/

Implement regular expression matching with support for'.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element.
采用递归的方式求解

溢出:

Last executed input:"aaaaaaaaaaaaab", "a*a*a*a*a*a*a*a*a*a*c"

class Solution:
    # @return a boolean
    def isMatch(self, s, p):
        if not s and (not p):
            return True
        elif not s:
            if len(p)>=2:
                if p[1] == '*' and self.isMatch(s,p[2:]):
                    return True
                else:
                    return False
            else:
                return False   
        elif not p:
            return False
        else:
            if len(p) >= 2 and p[1] == '*':
                if s[0] == p[0] or p[0] == '.':
                    if (self.isMatch(s,p[2:]) or
                        self.isMatch(s[1:],p) or
                        self.isMatch(s[1:],p[2:])):
                        return True
                    else:
                        return False
                else:
                    return self.isMatch(s,p[2:])
            else:
                if s[0]==p[0] or p[0] == '.':
                    return self.isMatch(s[1:],p[1:])


既然给我这样的测试程序。对症下药,在前面加了个简化p的程序。然后。。。就可以了=-=!

379ms , 排在老后面了········

class Solution:
    # @return a boolean
    def isMatch(self, s, p):
        #simplify p
        i = 0
        plist = []
        while (i<len(p)):
            if (i+1)<len(p) and p[i+1]=='*':
                if not plist or plist[-1] != p[i:i+2]:
                    plist.append(p[i:i+2])
                i = i+2
            else:
                plist.append(p[i])
                i = i+1
        Newp = ''.join(plist)
        RES = self.Matching(s,Newp)
        return RES

    
    def Matching(self, s, p):
        if not s and (not p):
            return True
        elif not s:
            if len(p)>=2:
                if p[1] == '*' and self.Matching(s,p[2:]):
                    return True
                else:
                    return False
            else:
                return False   
        elif not p:
            return False
        else:
            if len(p) >= 2 and p[1] == '*':
                if s[0] == p[0] or p[0] == '.':
                    if (self.Matching(s,p[2:]) or
                        self.Matching(s[1:],p) or
                        self.Matching(s[1:],p[2:])):
                        return True
                    else:
                        return False
                    
                else:
                    return self.Matching(s,p[2:])
            else:
                if s[0]==p[0] or p[0] == '.':
                    return self.Matching(s[1:],p[1:])
                else:
                    return False


更快的方法应该使用栈吧。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值