正则表达式匹配。给定一个字符串 (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)$。