Given an input string (s
) and a pattern (p
), implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character. '*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
/* 字符串匹配: .匹配任意一个字符 c*表示重复字符c任意次 包含0次 特例前面重复的是.的情况
* ab a*b a a* abc a.*
* p[j-1]='*' dp[i][j]= dp[i][j-2](消除) || dp[i][j-1](重复一次 *看做空) || (s[i-1]==p[j-1] || p[j-2] == '.' && dp[i-1][j](重复.匹配任意一个字符))
* */
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;
// 能匹配空串的模式串 c*c*c*
for(int j=1;j<=plen;j++){
dp[0][j] = p[j-1] == '*' && dp[0][j-2];
}
for(int i=1;i<=slen;i++){
for(int j=1;j<=plen;j++){
if(p[j-1] != '*'){
dp[i][j] = dp[i-1][j-1] && (s[i-1] == p[j-1] || p[j-1] == '.');
}
else{
dp[i][j] = dp[i][j-2] || dp[i][j-1] || ((p[j-2]=='.' || s[i-1]==p[j-2]) && dp[i-1][j]);
}
}
}
return dp[slen][plen];
}
};