题目简介:
给你一个字符串 s
和一个字符规律 p
,请你来实现一个支持 '.'
和 '*'
的正则表达式匹配。
1 | '.' 匹配任意单个字符 |
所谓匹配,是要涵盖 整个 字符串 s
的,而不是部分字符串。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符.
和*
。
示例 1:
1 | 输入: |
示例 2:
1 | 输入: |
示例 3:
1 | 输入: |
示例 4:
1 | 输入: |
示例 5:
1 | 输入: |
思路:
又是一道看了解析也做的异常艰难的题…尽力把思路讲清楚吧
首先利用动态规划的思想,dp[i][j]
代表s[0...i]
和p[0...j]
是否能匹配成功。
为了方便处理边界问题,两个字符串都先在开头加上一个空格,初始化dp[0][0] = true
。
然后先初始化字符串s
为空时,匹配的情况,也就是初始化dp[0][j]
的值。只有当p[j] == '*'
时,令p[j - 1]
重复0次,也就是去掉p[j - 1], p[j]
这两个字符,才有可能与空字符串匹配成功,此时dp[0][j] == dp[0][j - 2]
。
然后开始循环遍历s
与j
字符串,会遇到以下这几种情况:
p[j] != '*'
时,若s[i] == p[j] || p[j] == '.'
,那么当前字符是匹配成功的,所以dp[i][j] == dp[i - 1][j - 1]
。p[j] == '*'
时:- 匹配0次,也就是将
p[j - 1], p[j]
都去除后能匹配成功,dp[i][j] == dp[i][j - 2]
。 - 当
p[j - 1] == '.' || p[j - 1] == s[i]
时,则dp[i][j]
取决于dp[i - 1][j]
,因为在s
最后加一个一样的字符也没有关系,即s[i] == s[i - 1]
,因为*
可以匹配任意个相同的字符。所以dp[i][j] == dp[i - 1][j]
。(aaa
与aaa*
是匹配的,也就是*
使末尾的a
重复一次:a* == a
) - 综合上面两种情况,
dp[i][j] == zero || one
。
- 匹配0次,也就是将
最后返回dp[s.length() - 1][p.length() - 1]
即可。
tip:
- 开头加空格的方法很实用,利于代码的理解及后续操作。
代码如下:
1 | class Solution { |