zoukankan      html  css  js  c++  java
  • 牛客网-(标星)正则表达式的匹配

    题目描述

    请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

    分析

    自己在那敲了两个小时...无穷无尽的情况补漏洞补到我要die!!!!

    隐隐能感到可以用递归

    但是 遇到这种感觉就习惯去分情况写,看了讨论觉得自己就是个渣渣

    代码

    class Solution:
        # s, pattern都是字符串
        def match(self, s, pattern):
            # 如果s与pattern都为空,则True
            if len(s) == 0 and len(pattern) == 0:
                return True
            # 如果s不为空,而pattern为空,则False
            elif len(s) != 0 and len(pattern) == 0:
                return False
            # 如果s为空,而pattern不为空,则需要判断
            elif len(s) == 0 and len(pattern) != 0:
                # pattern中的第二个字符为*,则pattern后移两位继续比较
                if len(pattern) > 1 and pattern[1] == '*':
                    return self.match(s, pattern[2:])
                else:
                    return False
            # s与pattern都不为空的情况
            else:
                # pattern的第二个字符为*的情况
                if len(pattern) > 1 and pattern[1] == '*':
                    # s与pattern的第一个元素不同,则s不变,pattern后移两位,相当于pattern前两位当成空
                    if s[0] != pattern[0] and pattern[0] != '.':
                        return self.match(s, pattern[2:])
                    else:
                        # 如果s[0]与pattern[0]相同,且pattern[1]为*,这个时候有三种情况
                        # pattern后移2个,s不变;相当于把pattern前两位当成空,匹配后面的
                        # pattern后移2个,s后移1个;相当于pattern前两位与s[0]匹配
                        # pattern不变,s后移1个;相当于pattern前两位,与s中的多位进行匹配,因为*可以匹配多位
                        return self.match(s, pattern[2:]) or self.match(s[1:], pattern[2:]) or self.match(s[1:], pattern)
                # pattern第二个字符不为*的情况
                else:
                    if s[0] == pattern[0] or pattern[0] == '.':
                        return self.match(s[1:], pattern[1:])
                    else:
                        return False
    

      

  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/ditingz/p/12172664.html
Copyright © 2011-2022 走看看