剑指正则表达式.*

因为这个想得太乱了,mark在这边记下来

NOTE:涉及二元的只有*,因此将*和其他分开即可。同时又是一个递归方法,设置扫描终止条件。

class Solution3:
    # s, pattern都是字符串
    # 问题可以分为两个部分,匹配过了的,和没有匹配的,可以拆分之后用递归来完成
    # 每次匹配第一位时,都有三种情况
    def match(self, s, pattern):
        # write code here
        if s is None or pattern is None:
            return False
        s_idx = 0
        pattern_idx = 0
        return self.matchCore(s, s_idx, pattern, pattern_idx)

    def matchCore(self, s, s_idx, pattern, p_idx):
        if len(s) == s_idx and len(pattern) == p_idx:
            return True
        if len(s) > s_idx and len(pattern) == p_idx:
            return False

        if p_idx + 1 < len(pattern) and pattern[p_idx + 1] == '*':
            if (not isChrTail(len(s), s_idx)) and (pattern[p_idx] == s[s_idx] or pattern[p_idx] == '.'):
                return self.matchCore(s, s_idx + 1, pattern, p_idx + 2) or self.matchCore(s, s_idx, pattern,p_idx + 2) or self.matchCore(s, s_idx + 1,pattern,p_idx)
                pass
            else:
                return self.matchCore(s, s_idx, pattern, p_idx + 2)
                pass
            pass

        if (not isChrTail(len(s), s_idx)) and (pattern[p_idx] == s[s_idx] or pattern[p_idx] == '.'):
            return self.matchCore(s, s_idx + 1, pattern, p_idx + 1)
        return False


def isChrTail(str_len, idx):
    if str_len - idx:
        return False
    return True

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值