微软面试题 07022012 [3]

来源:互联网 发布:网络招聘有效性 编辑:程序博客网 时间:2024/06/07 16:33
/*原文地址:http://basicalgos.blogspot.com/2012/03/10-regular-expression-matching.htmlImplement 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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa", ".*") → trueisMatch("ab", ".*") → trueisMatch("aab", "c*a*b") → trueThere are four patterns in the regular expression: c*.*.cBased 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!";elsestd::cout << "Unmatched!";return 0;}

原创粉丝点击