/*
原文地址:http://basicalgos.blogspot.com/2012/03/10-regular-expression-matching.html
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
There are four patterns in the regular expression:
c*
.*
.
c
Based on these four patterns, first we can check whether *(p+1) is '*' or not, and deal with different cases based on this.
*/
#include <iostream>
bool isMatch(const char* s, const char* p)
{
if(*s == '\0' && *p == '\0')
return true;
if(*s == '\0' && *(p + 1) == '*')
return isMatch(s, p + 2);
if(*s == '\0' || *p == '\0')
return false;
if(*(p + 1) == '*')
{
if(*p == '.')
return isMatch(s, p + 2) || isMatch(s + 1, p) || isMatch(s + 1, p + 2);
if(*p != *s)
return isMatch(s, p + 2);
return isMatch(s + 1, p) || isMatch(s, p + 2);
}
if(*p == '.')
return isMatch(s + 1, p + 1);
if(*s != *p)
return false;
return isMatch(s + 1, p + 1);
};
int main()
{
const char s[] = "aab";
const char p[] = "c*a*b*";
bool b = isMatch(s, p);
if(b)
std::cout << "Matched!";
else
std::cout << "Unmatched!";
return 0;
}
微软面试题 07022012 [3]
最新推荐文章于 2025-03-29 15:23:34 发布