1 #include"iostream" 2 using namespace std; 3 4 bool MatchCore(char*str,char* pattern); 5 6 bool Match(char* str,char* pattern) 7 { 8 if(str==nullptr||pattern==nullptr) 9 return false; 10 return MatchCore(str,pattern); 11 } 12 13 bool MatchCore(char*str,char* pattern) 14 { 15 if(*str==‘\0‘&&*pattern==‘\0‘) 16 return true; 17 if(*(pattern+1)==‘*‘) 18 { 19 if(*str==*pattern||(*pattern==‘.‘&&*str!=‘\0‘)) 20 return MatchCore(str,pattern+2)||MatchCore(str+1,pattern+2) || MatchCore(str+1,pattern); 21 else 22 return MatchCore(str,pattern+2); 23 } 24 if(*str==*pattern||(*pattern==‘.‘&&*str!=‘\0‘)) 25 return MatchCore(str+1,pattern+1); 26 return false; 27 } 28 29 void Test(char* testName,char* str,char* pattern,bool expect) 30 { 31 cout<<testName<<": "; 32 if(Match(str,pattern)==expect) 33 cout<<"passed."<<endl; 34 else 35 cout<<"failed."<<endl; 36 } 37 38 int main() 39 { 40 Test("test1","aabcaa","a*b*.a*",true); 41 Test("test2","","",true); 42 Test("test3","aaa","a*a.",true); 43 Test("test4",nullptr,nullptr,false); 44 Test("test5","abccdde","b*ab*c*d*e.",false); 45 46 return 0; 47 }
官方答案,测试用例写的真是很详细:
1 // 面试题19:正则表达式匹配 2 // 题目:请实现一个函数用来匹配包含‘.‘和‘*‘的正则表达式。模式中的字符‘.‘ 3 // 表示任意一个字符,而‘*‘表示它前面的字符可以出现任意次(含0次)。在本题 4 // 中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a" 5 // 和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。 6 7 #include <cstdio> 8 9 bool matchCore(const char* str, const char* pattern); 10 11 bool match(const char* str, const char* pattern) 12 { 13 if(str == nullptr || pattern == nullptr) 14 return false; 15 16 return matchCore(str, pattern); 17 } 18 19 bool matchCore(const char* str, const char* pattern) 20 { 21 if(*str == ‘\0‘ && *pattern == ‘\0‘) 22 return true; 23 24 if(*str != ‘\0‘ && *pattern == ‘\0‘) 25 return false; 26 27 if(*(pattern + 1) == ‘*‘) 28 { 29 if(*pattern == *str || (*pattern == ‘.‘ && *str != ‘\0‘)) 30 // 进入有限状态机的下一个状态 31 return matchCore(str + 1, pattern + 2) 32 // 继续留在有限状态机的当前状态 33 || matchCore(str + 1, pattern) 34 // 略过一个‘*‘ 35 || matchCore(str, pattern + 2); 36 else 37 // 略过一个‘*‘ 38 return matchCore(str, pattern + 2); 39 } 40 41 if(*str == *pattern || (*pattern == ‘.‘ && *str != ‘\0‘)) 42 return matchCore(str + 1, pattern + 1); 43 44 return false; 45 } 46 47 // ====================测试代码==================== 48 void Test(const char* testName, const char* string, const char* pattern, bool expected) 49 { 50 if(testName != nullptr) 51 printf("%s begins: ", testName); 52 53 if(match(string, pattern) == expected) 54 printf("Passed.\n"); 55 else 56 printf("FAILED.\n"); 57 } 58 59 int main(int argc, char* argv[]) 60 { 61 Test("Test01", "", "", true); 62 Test("Test02", "", ".*", true); 63 Test("Test03", "", ".", false); 64 Test("Test04", "", "c*", true); 65 Test("Test05", "a", ".*", true); 66 Test("Test06", "a", "a.", false); 67 Test("Test07", "a", "", false); 68 Test("Test08", "a", ".", true); 69 Test("Test09", "a", "ab*", true); 70 Test("Test10", "a", "ab*a", false); 71 Test("Test11", "aa", "aa", true); 72 Test("Test12", "aa", "a*", true); 73 Test("Test13", "aa", ".*", true); 74 Test("Test14", "aa", ".", false); 75 Test("Test15", "ab", ".*", true); 76 Test("Test16", "ab", ".*", true); 77 Test("Test17", "aaa", "aa*", true); 78 Test("Test18", "aaa", "aa.a", false); 79 Test("Test19", "aaa", "a.a", true); 80 Test("Test20", "aaa", ".a", false); 81 Test("Test21", "aaa", "a*a", true); 82 Test("Test22", "aaa", "ab*a", false); 83 Test("Test23", "aaa", "ab*ac*a", true); 84 Test("Test24", "aaa", "ab*a*c*a", true); 85 Test("Test25", "aaa", ".*", true); 86 Test("Test26", "aab", "c*a*b", true); 87 Test("Test27", "aaca", "ab*a*c*a", true); 88 Test("Test28", "aaba", "ab*a*c*a", false); 89 Test("Test29", "bbbba", ".*a*a", true); 90 Test("Test30", "bcbbabab", ".*a*a", false); 91 92 return 0; 93 }
原文地址:https://www.cnblogs.com/acm-jing/p/10410362.html
时间: 2024-10-31 22:51:55