Leetcode 10. Regular Expression Matching

class Solution(object):
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        if len(p)==0:
            return len(s)==0
        if len(p)>1 and p[1]=='*':
            return self.isMatch(s,p[2:]) or (len(s)!=0 and (s[0]==p[0] or p[0]=='.') and self.isMatch(s[1:],p))
        else:
            return len(s)!=0 and (s[0]==p[0] or p[0]=='.') and self.isMatch(s[1:],p[1:])
        

这道题有多种解法,上一题用的是递归解法。思路如下:

先判断p是否为空,为空的话那么s必须也是空,否则没有可匹配的内容了。然后考虑p[2]=='*',因为.可以代表任意一个字符,而*可以代表0个或多个pre元素,更加复杂。我们先考虑第二个字符为*,这意味着它可以重复前面元素任意次。这里就有两种情况,0次和大于0次:

首先考虑0次的时候,此时直接把p中前两个字符去掉再递归,因为前两个字符匹配了空

然后考虑非0次的时候,*匹配了至少一次,那么首先s不能为空,其次满足s[0]和p[0]是匹配的,注意这里的条件是p[1]==*,如果第一个字符不匹配了后面*还匹配了一次就不成立了,最后因为*可以重复多次,比如*可能匹配的是aaa,这时需要逐字符去判断,也就是s右移一位去判断。

如果不满足p.size() > 1 && p[1] == '*',那么就比较第一个字符就可以了,然后再逐字符去调用递归。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值