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).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch(“aa”,”a”) → false
isMatch(“aa”,”aa”) → true
isMatch(“aaa”,”aa”) → false
isMatch(“aa”, “a*”) → true
isMatch(“aa”, “.*”) → true
isMatch(“ab”, “.*”) → true
isMatch(“aab”, “c*a*b”) → true
分两种情况讨论:
1. 如果p[i+1] == ‘*’,循环递归直到p[i]和s[i]无法匹配为止。
2. 如果p[i+1] != ‘*’,则判断p[i]和s[i]是否匹配,并递归。
class Solution {
public:
bool isMatch(string s, string p) {
if(p=="") return s=="";
int i=0,j=0;
if(p[i+1]=='*'){
while(p[i]=='.'&&s[j]!='\0' || p[i]==s[j]){
if(isMatch(s.substr(j),p.substr(i+2))) return true;
j++;
}
return isMatch(s.substr(j),p.substr(i+2));
}else if(p[i]=='.'&&s[j]!='\0' || p[i]==s[j]){
return isMatch(s.substr(j+1),p.substr(i+1));
}
return false;
}
};