正则表达式
今天是小安开始Leetcode刷题的第10题,正文开始ing?
题目描述
给定一个字符串 (s) 和一个字符模式 §。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
题目原址
‘.’ 匹配任意单个字符。
‘*’ 匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s) ,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
示例1
输入:
s = “aa”
p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。
示例2
输入:
s = “aa”
p = “a*”
输出: true
解释: ‘*’ 代表可匹配零个或多个前面的元素, 即可以匹配 ‘a’ 。因此, 重复 ‘a’ 一次, 字符串可变为 “aa”。
示例3
输入:
s = “ab”
p = “."
输出: true
解释: ".” 表示可匹配零个或多个(’*’)任意字符(’.’)。
示例4
输入:
s = “aab”
p = “cab”
输出: true
解释: ‘c’ 可以不被重复, ‘a’ 可以被重复一次。因此可以匹配字符串 “aab”。
示例5
输入:
s = “aab”
p = “cab”
输出: true
解释: ‘c’ 可以不被重复, ‘a’ 可以被重复一次。因此可以匹配字符串 “aab”。
方法:递归
思路
递归实现:
当前值匹配:s[i]=p[i] or p[i]=‘0’
需要考虑一下情况:
- 字符串s、模式p为空
- p下一个字符是否"*":
a. if next字符不为 “*” ,进行当前值匹配判断,若匹配则递归下一个字符
b. if next字符为“*”,进行当前值匹配判断,若匹配则考虑*字符匹配s中几个字符。若匹配1-多个字符,则字符串后移匹配下一个;若匹配0个,则模式p从第3个继续匹配s
代码实现
【Python实现】
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
if len(s)==0 and len(p)==0:#字符串为0
return True
elif len(s)!=0 and len(p)==0:
return False
elif len(s)==0:
if len(p)>1 and p[1]=='*':
return self.isMatch(s,p[2:])
else:
return False
else:
if len(p)>1:
if p[1]!='*':
if s[0]==p[0] or p[0]=='.':#匹配当前值
return self.isMatch(s[1:],p[1:])
else:
return False
elif s[0]==p[0] or p[0]=='.':
return self.isMatch(s,p[2:]) or self.isMatch(s[1:],p)
else:
return self.isMatch(s,p[2:])
elif len(s)==1:
return s[0]==p[0] or p[0]=='.'
else:
return False