剑指 Offer 19. 正则表达式匹配
请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。
示例 1:
输入:
s = “aa”
p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。
动态规划
*
代表可以重复0-n次前面的字符,.
表示转换成任意字符。
参考解释
class Solution {
public:
bool isMatch(string s, string p) {
int slen = s.length(), plen = p.length();
vector<vector<bool>> dp(slen + 1, vector<bool>(plen + 1, false));
dp[0][0] = true;
for(int i = 1; i <= plen; i++){
//s = ""
//p = "a*"
//*让a出现0次,那么s与p匹配(与下面*=0情况一样)
if(i >= 2 && p[i - 1] == '*' && dp[0][i - 2])
dp[0][i] = dp[0][i - 2];
}
for(int i = 1; i <= slen; i++){
for(int j = 1; j <= plen; j++){
//1、如果p[j-1]是正常字符且等于s[i-1],或者p[j-1]是'.'
if(s[i - 1] == p[j - 1] || p[j - 1] == '.')
dp[i][j] = dp[i - 1][j - 1];
//2、如果p[j-1] = '*'的话,讨论p[j-2]:
else if(p[j - 1] == '*' && j >= 2){
//2.1、如果p[j-2]是一个正常字符而且与s[i-1]不相等,且p[j-2]不等于'.'
//s = "b"
//p = "a*"
if(p[j - 2] != s[i - 1] && p[j - 2] != '.')
//*让a出现0次,那么s与p匹配
dp[i][j] = dp[i][j-2];
//2.2、如果p[j-2]是一个正常字符且与s[i-1]相等,或者p[j-2]等于'.'
else{
//* = 0:
//s = "a"
//p = "aa*"
//* = 1:
//s = "a"
//p = "a*"
//* = n:
//s = "aabb"
//p = "aab*"
dp[i][j] = dp[i][j - 2] || dp[i][j - 1] || dp[i - 1][j];
}
}
}
}
//最后返回的是dp[slen][plen],比较的是s[slen-1],p[plen-1]
//如果dp初始化的长度为dp(slen,plen),那么只能索引到dp[slen-1][plen-1],所以初始化要+1
return dp[slen][plen];
}
};