LeetCode 题解工作台
正则表达式匹配
给你一个字符串 s 和一个字符规律 p ,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 返回一个布尔值,表示匹配是否覆盖整个输入字符串(而非部分)。 示例 1: 输入: s = "aa", p = "a" 输出: fal…
3
题型
9
代码语言
3
相关题
当前训练重点
困难 · 状态·转移·动态规划
答案摘要
我们设计一个函数 $dfs(i, j)$,表示从 的第 个字符开始,和 的第 个字符开始是否匹配。那么答案就是 $dfs(0, 0)$。 函数 $dfs(i, j)$ 的计算过程如下:
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.'匹配任意单个字符'*'匹配零个或多个前面的那一个元素
返回一个布尔值,表示匹配是否覆盖整个输入字符串(而非部分)。
示例 1:
输入:s = "aa", p = "a" 输出:false 解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:s = "aa", p = "a*" 输出:true 解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:
输入:s = "ab", p = ".*" 输出:true 解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
提示:
1 <= s.length <= 201 <= p.length <= 20s只包含从a-z的小写字母。p只包含从a-z的小写字母,以及字符.和*。- 保证每次出现字符
*时,前面都匹配到有效的字符
解题思路
方法一:记忆化搜索
我们设计一个函数 ,表示从 的第 个字符开始,和 的第 个字符开始是否匹配。那么答案就是 。
函数 的计算过程如下:
- 如果 已经到达 的末尾,那么如果 也到达了 的末尾,那么匹配成功,否则匹配失败。
- 如果 的下一个字符是
'*',我们可以选择匹配 个 字符,那么就是 。如果此时 并且 和 匹配,那么我们可以选择匹配 个 字符,那么就是 。 - 如果 的下一个字符不是
'*',那么如果 并且 和 匹配,那么就是 。否则匹配失败。
过程中,我们可以使用记忆化搜索,避免重复计算。
时间复杂度 ,空间复杂度 。其中 和 分别是 和 的长度。
class Solution:
def isMatch(self, s: str, p: str) -> bool:
@cache
def dfs(i, j):
if j >= n:
return i == m
if j + 1 < n and p[j + 1] == '*':
return dfs(i, j + 2) or (
i < m and (s[i] == p[j] or p[j] == '.') and dfs(i + 1, j)
)
return i < m and (s[i] == p[j] or p[j] == '.') and dfs(i + 1, j + 1)
m, n = len(s), len(p)
return dfs(0, 0)
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | Let |
| 空间 | The only memory we use is the |
面试官常问的追问
外企场景- question_mark
Assess understanding of dynamic programming, especially with state transitions.
- question_mark
Check if the candidate can handle special cases like empty strings or patterns with consecutive '*' and '.' characters.
- question_mark
Evaluate the candidate’s ability to optimize recursive solutions using memoization.
常见陷阱
外企场景- error
Failing to handle edge cases like empty string `s` or pattern `p` properly.
- error
Not correctly implementing the handling of '*' to match zero occurrences of the preceding character.
- error
Overcomplicating the solution without leveraging dynamic programming or recursion effectively.
进阶变体
外企场景- arrow_right_alt
Extend the problem to match the pattern with case sensitivity or allow more complex special characters.
- arrow_right_alt
Solve the problem with a greedy approach instead of dynamic programming.
- arrow_right_alt
Modify the problem to check for partial string matching rather than complete string matching.