python给你一个字符串 s 和一个字符规律 p(分别用空格隔开),请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。 1: '.' 匹配任意单个字符 2: '*' 匹配零个或多个前面的那一个元素
时间: 2023-12-20 17:05:27 浏览: 21
好的,这是一个比较常见的正则表达式匹配问题,可以使用动态规划来解决。
我们可以使用一个二维数组 dp[i][j] 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配。那么状态转移方程为:
1. 当 p[j-1] 是普通字符时,dp[i][j] = dp[i-1][j-1] && s[i-1]==p[j-1]
2. 当 p[j-1] 是 '.' 时,dp[i][j] = dp[i-1][j-1]
3. 当 p[j-1] 是 '*' 时,分为两种情况:
1) 如果 '*' 匹配零个前面的字符,即 dp[i][j] = dp[i][j-2]
2) 如果 '*' 匹配一个或多个前面的字符,即 dp[i][j] = dp[i-1][j] && s[i-1]==p[j-2] 或 dp[i][j] = dp[i][j-1] && s[i-1]==p[j-2]
最终的答案就是 dp[len(s)][len(p)]。
下面是代码实现:
```python
def isMatch(s: str, p: str) -> bool:
m, n = len(s), len(p)
dp = [[False] * (n+1) for _ in range(m+1)]
dp[0][0] = True
for i in range(1, n+1):
if p[i-1] == '*':
dp[0][i] = dp[0][i-2]
for i in range(1, m+1):
for j in range(1, n+1):
if s[i-1] == p[j-1] or p[j-1] == '.':
dp[i][j] = dp[i-1][j-1]
elif p[j-1] == '*':
if dp[i][j-2]:
dp[i][j] = True
elif s[i-1] == p[j-2] or p[j-2] == '.':
dp[i][j] = dp[i-1][j]
return dp[m][n]
```
注意要判断特殊情况,比如 s 和 p 都为空的情况,以及 p 中连续出现的 '*'。