我的博客

leetcode 力扣 10. 正则表达式匹配 python

目录
  1. 解答

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

‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

说明:

s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
示例 1:

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

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

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

输入:
s = “aab”
p = “cab”
输出: true
解释: 因为 ‘*’ 表示零个或多个,这里 ‘c’ 为 0 个, ‘a’ 被重复一次。因此可以匹配字符串 “aab”。
示例 5:

输入:
s = “mississippi”
p = “misisp*.”
输出: false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regular-expression-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

输入的 pattern 里不会有连续的两个 *

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution:
def isMatch(self, s: str, p: str) -> bool:
ls = len(s)
lp = len(p)
dp = [set() for _ in range(lp+1)]
dp[0].add(0)
for i in range(lp):
if i > 0 and not dp[i] and not dp[i-1]:
break
if p[i] == '.':
for x in dp[i]:
if x < ls:
dp[i+1].add(x+1)
elif p[i] == '*':
if p[i-1] == '.':
minx = ls+1
for xx in dp[i]: minx = min(minx, xx)
if i - 1 >= 0:
for xx in dp[i-1]: minx = min(minx, xx)
while minx <= ls:
dp[i+1].add(minx)
minx += 1
else:
for x in dp[i]:
dp[i+1].add(x)
while x < ls:
if (s[x] != p[i-1]):
break
dp[i+1].add(x+1)
x += 1
if i - 1 >= 0:
for x in dp[i-1]:
dp[i+1].add(x)
while x < ls:
if (s[x] != p[i-1]):
break
dp[i+1].add(x+1)
x += 1
else:
for x in dp[i]:
if x < ls and s[x] == p[i]:
dp[i+1].add(x+1)
if ls in dp[-1]:
return True
return False

评论无需登录,可以匿名,欢迎评论!