题目描述
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
Code(c++)
//法一:
bool isMatch(string s, string p) {
int slen = s.length();
int plen = p.length();
if(slen == 0){
for(int i = 0; i < plen; ++i)
if(p[i] != '*' && p[i] != '.')
return false;
return true;
}
if(plen == 0)
return false;
if(plen == 1 || p[1] != '*'){
if(p[0] == s[0] || p[0] == '.')
return isMatch(s.substr(1), p.substr(1));
else
return false;
}
else{
int i = 0;
while(i <= slen &&
!isMatch(s.substr(i), p.substr(2)))
i++;
if(i > slen)
return false;
return true;
}
}
//法二:
bool isMatch(string s, string p) {
int slen = s.length();
int plen = p.length();
if(slen == 0){
for(int i = 0; i < plen; ++i)
if(p[i] != '*' && p[i] != '.')
return false;
return true;
}
if(plen == 0)
return false;
if(plen == 1 || p[1] != '*'){
if(p[0] == s[0] || p[0] == '.')
return isMatch(s.substr(1), p.substr(1));
else
return false;
}
else{
if(p[0] == s[0] || p[0] == '.')
return isMatch(s, p.substr(2)) ||
isMatch(s.substr(1), p);
else
return isMatch(s, p.substr(2));
}
}
note:
- 这种匹配类题目,最快想到的方法应该就是用递归的方式来解决