力扣-正则表达式匹配

题目

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

  • '.' 匹配任意单个字符
  • '*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

示例 1:

**输入:**s = “aa”, p = “a”
**输出:**false
解释:“a” 无法匹配 “aa” 整个字符串。

示例 2:

**输入:*s = “aa”, p = "a"
**输出:**true
**解释:**因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。

示例 3:

**输入:**s = “ab”, p = “."
**输出:**true
解释:".
” 表示可匹配零个或多个(‘*’)任意字符(‘.’)。

思路

首先想清楚这个题要干什么,思考方式首先很容易想到双指针对比,对比s和p的每一个字符是否相同,但是这里就会有一个问题,也就是这道题的难点* 符号把这道题的做法引向了DP,0个或者多个的含义代表我们的p指针往前走这一步s指针可以走0也可以一直往前直到没法再走,结果进行特判要想清楚每一种的边界情况该如何处理。

代码

pLen = len(p)  
sLen = len(s)  
@cache  
def DP(i,j):  
    if(i==sLen ):  
        if(j == pLen):  
            return True  
        else:  
            if(j + 1 < pLen and p[j+1] == "*"):  
                return DP(i,j+2)  
            else:  
                return False  
    if(j == pLen):  
        return False  
    if(j + 1 < pLen and p[j+1] == "*"):  
        ret = DP(i,j+2)  
        if(p[j] == "." or s[i] == p[j]):  
            ret = ret or DP(i+1,j)  
        return ret  
    else:  
        if(s[i] == p[j] or p[j] == "."):  
            return DP(i + 1,j + 1)  
        else:  
            return False  
return DP(0,0)

猜你喜欢

转载自blog.csdn.net/TongOuO/article/details/132255339