Leetcode:正则表达式.

这题比较难,需要采取递归下降的方式来解析数据,并处理边界问题。

class Solution(object):
    def isMatch(self, s, p):
        print(s,p,'...')
        i,n = 0,len(p)
        if s=='':return p=='' or (len(p)>=2 and p[1]=='*' and self.isMatch('',p[2:]))
        if p=='':return False
        if len(p)==1:return (s[0]==p[0] or p[0]=='.') and self.isMatch(s[1:],p[1:])
        if s[-1]!=p[-1] and p[-1]!='.' and p[-1]!='*' :return False
        ch = p[0]
        if ch=='.':
            if p[1]=='*':
                j,n_s = 0,len(s)
                while j<n_s+1:
                    res = self.isMatch(s[j:],p[2:])
                    if res==False:pass
                    else:return True
                    j+=1
                return False
            else:#p[i+1] is normal charcter
                return  self.isMatch(s[1:],p[1:])
        else:#normal charcter
            if p[1]=='*':#match 0 or more
                j = 0
                n_s = len(s)-1
                while j<=n_s+1:
                    if (j>0 and s[j-1]!=ch):break;
                    print(j,s,p,ch,s[j-1],n_s)
                    res = self.isMatch(s[j:],p[2:])
                    if res==False:pass
                    else:return True
                    j+=1
                return False
            else:
                return ch==s[0] and self.isMatch(s[1:],p[1:])

print(Solution().isMatch("ab"
,"a*"))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值