题目
给你一个字符串 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 = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例 5:
输入:
s = "mississippi"
p = "mis*is*p*."
输出: false
思路
采用动态规划的方法, d p dp dp 数组 dp[i][j]
表示 s s s 的前 i
个字符与 p p p 的前 j
个字符匹配,当 p p p 为单个字符 a-z
或者 '.'
时,直接与 s s s 一一匹配即可,但是当 p p p 为字符+*的组合时,情况要复杂一些,可以分情况分析:
- 当
p[j] != ’*‘
时:如果dp[i-1][j-1]
匹配时,那么只需s[i] == p[j]
即可; - 当
p[j] == '*'
时:s[i]
与p[j]
匹配有两种情况,(1)s[i]
与字符+’*‘
号匹配,(2)s[i]
与'*'
号前的字符匹配;
可以列出状态转移方程如下:
d p [ i ] [ j ] = { p [ j ] ≠ ∗ = { d p [ i − 1 ] [ j − 1 ] , s [ i ] = = p [ j ] o