正则表达式匹配。给定一个字符串 (s
) 和一个字符模式 (p
)。实现支持 '.'
和 '*'
的正则表达式匹配。
1 |
|
匹配应该覆盖整个字符串 (s
) ,而不是部分字符串。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符.
和*
。
示例 1:
1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
示例 4:
1 |
|
示例 5:
1 |
|
思路一
采用递归解决,假设不存在 *
通配符,则一次遍历即可完成比较,即每次比较s
和p
的第一个字符是否匹配即可:first_match = bool(s) and p[0] in {s[0], '.'}
;当存在*
通配符时,假设p
的输入是合法的,下面两种情况只要其中一种匹配即可:
s
和p[2:]
匹配;- 第一个字符匹配即
first_match
同时s[1:]
和p
匹配。
1 |
|
假设 s
和 p
的长度分别为 $S$ 和 $P$,则时间复杂度为 \(O(2^{S+\frac P 2})\)。
思路二
使用动态规划解决,假设dp[i][j]
表示s[i:]
和p[j:]
是否匹配,通过自底向上进行遍历。
1 |
|
时间复杂度 $O(SP)$。
思路三
动态规划+递归,dp[i][j]
表示s[i:]
和p[j:]
是否匹配,自顶向下遍历。
1 |
|
时间复杂度 $O(SP)$。