题目
给你一个字符串 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)