剑指offer——面试题19:正则表达式匹配

 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 }
View Code

官方答案,测试用例写的真是很详细:

 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 }
View Code

猜你喜欢

转载自www.cnblogs.com/acm-jing/p/10410362.html