10. 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
- s 可能为空,且只包含从 a-z 的小写字母。
- p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
- 不考虑 p 中会出现连续*出现
Example
input |
---|
s = "aa",p = "a" |
output |
false |
input |
---|
s = "aa",p = "a*" |
output |
true |
input |
---|
s = "ab",p = ".*" |
output |
true |
input |
---|
s = "aab",p = "c*a*b" |
output |
true |
input |
---|
s = "mississippi",p = "mis*is*p*." |
output |
false |
Note
无
思路
首先要想到dp(平时做题遇到字符串的多想想dp,双指针这些方法)
令 d p [ i ] [ j ] dp[i][j] dp[i][j]表示字符串从下标0开始,到 s [ i ] s[i] s[i]和 p [ j ] p[j] p[j]能否匹配,那么有以下情况:
- p [ j ] p[j] p[j]为字母 a − z a-z a−z:
此时 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i−1][j−1] and s [ i ] = = p [ j ] s[i] == p[j] s[i]==p[j] - p [ j ] p[j] p[j]为字符 . . .:
此时 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i−1][j−1]