10.正则表达式匹配
正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*‘ 的正则表达式匹配。
- ‘.’ 匹配任意单个字符
- ‘*‘ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。
示例 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 <= 20
- 1 <= p.length <= 20
- s 只包含从 a-z 的小写字母
- p 只包含从 a-z 的小写字母,以及字符 . 和 *
- 保证每次出现字符 * 时,前面都匹配到有效的字符
解析
使用动态规划,dp[i][j] 表示 s 的前 i 个字符与 p 的前 j 个字符是否匹配。
核心转移方程:
- 如果
p[j-1]是普通字符或.,且与s[i-1]匹配,则dp[i][j] = dp[i-1][j-1] - 如果
p[j-1]是*,有两种情况:*匹配零次:dp[i][j] = dp[i][j-2]*匹配一次或多次:如果p[j-2]匹配s[i-1],则dp[i][j] = dp[i-1][j]
1 | |
动态规划的关键在于理解 * 的两种情况:匹配零次(直接跳过前面的字符和 *)和匹配多次(消耗 s 中的一个字符,* 继续保留)。时间复杂度 O(mn),空间复杂度 O(mn)。
10.正则表达式匹配
https://leetcode.lz5z.com/10.regular-expression-matching/