题目描述
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
'’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
第一个想法
class Solution:
def isMatch(self, s: str, p: str) -> bool:
i=j=0 # i搜索s,j搜索p
while i<len(s) and j<len(p):
if j<len(p)-1: #只要不是最后一个,都对后一个元素检验是不是*
if p[j]=="." and p[j+1]=="*": #.加*,对s列表往后检索
j+=2
if j==len(p):
return True
else:
pass
elif p[j+1]=="*": #普通字符加*,用while语句来除去等于当前字符的字符
while i<len(s) and s[i]==p[j]:
i+=1
j+=2
elif p[j]==".": #仅有一个.,直接往后移一位
j+=1
i+=1
else: #直接检验当前元素是否相同
if s[i]==p[j]:
j+=1
i+=1
else:
return False
else: #如果到了最后一个元素了,直接比较检验就行了
if s[i]==p[j]:
j+=1
i+=1
return True if i==len(s) and j==len(p) else False
就是最普通的思路慢慢去匹配。但是遇到".#"这种情况就不知道怎么解决了
回溯
class Solution:
def isMatch(self, s: str, p: str) -> bool:
if not p: return not s
# 第一个字母是否匹配
first_match = bool(s and p[0] in {s[0],'.'})
# 如果 p 第二个字母是 *
if len(p) >= 2 and p[1] == "*":
return self.isMatch(s, p[2:]) or (first_match and self.isMatch(s[1:], p))
else:
return first_match and self.isMatch(s[1:], p[1:])
这个是题解里面的
先判断第一个元素,得出布尔值,再对第二个元素进行判断是否为*。如果是*,有两种情况,一个是忽略*前的元素,这种情况下直接把s和少了前两个元素的p带入原函数进行迭代。第二种情况是有一个或多个元素这种情况下把少了第一个元素的s和p带入原函数进行迭代。然后两种情况都算出来再进行或运算,得出答案
执行用时 :1808 ms, 在所有 Python3 提交中击败了9.32%的用户
内存消耗 :13.5 MB, 在所有 Python3 提交中击败了5.13%的用户