剑指offer:019正则表达式匹配

"""
题目:请实现一个函数用来匹配包括‘.’和‘*’的正则表达式。模式中的字符‘.’表示任意一个字符,而"*"表示它前面的字符可以出现
任意次(包括0次)。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa.a”和"ab*a"均不匹配
"""


class Solution:

    def __init__(self, string, pattern):
        self.string = string
        self.pattern = pattern
        self.pattern_length = len(pattern)
        self.string_length = len(string)

    def function(self):
        if self.string is None or self.pattern is None:
            return False
        return self.match(0, 0)

    def match(self, string_index, pattern_index):
        # 判断当前两个指针是否越界
        # 同时越界, 说明全部匹配成功, 程序结束
        if string_index >= self.string_length and pattern_index >= self.pattern_length:
            return True

        # 如果string_index没有走完,但是pattern_index走完了,那就肯定匹配不成功
        if string_index < self.string_length and pattern_index >= self.pattern_length:
            return False
        # 剩下的一种情况,string_index走完,pattern_index没有走完,可能是a*

        # 当前子串(以指针开头)第二个字符是‘*', 比较复杂
        if pattern_index+1 < self.pattern_length and self.pattern[pattern_index+1] == '*':
            # 首字符匹配成功
            if ((string_index < self.string_length) and self.string[string_index] == self.pattern[pattern_index]) or \
                    (self.pattern[pattern_index] == '.' and string_index < self.string_length):
                return self.match(string_index+1, pattern_index) or self.match(string_index+1, pattern_index+2) or \
                    self.match(string_index, pattern_index + 2)
            # 如果匹配不成功,那只能把(首字符*)忽略掉了,不然就得当成匹配不成功
            else:
                return self.match(string_index, pattern_index+2)

        # 当前子串第二个字符不是‘*’,情况比较简单
        # 当前子串的第一个字符匹配成功,两个索引指针同时向后挪
        if ((string_index < self.string_length) and self.string[string_index] == self.pattern[pattern_index]) or \
                (self.pattern[pattern_index] == '.' and string_index < self.string_length):
            return self.match(string_index+1, pattern_index+1)

        return False


if __name__ == '__main__':
    # 测试用例
    # string = 'aaa'
    # pattern = 'a.*a' # 匹配

    # string = 'aaa'
    # pattern = 'ab*ac*a' # 匹配

    string = 'aaa'
    pattern = 'ab*a'  # 不匹配

    s = Solution(string, pattern)
    print(s.function())

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值