zoukankan      html  css  js  c++  java
  • 剑指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==''&&*pattern=='')
    16         return true;
    17     if(*(pattern+1)=='*')
    18     {
    19         if(*str==*pattern||(*pattern=='.'&&*str!=''))
    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!=''))
    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 == '' && *pattern == '')
    22         return true;
    23 
    24     if(*str != '' && *pattern == '')
    25         return false;
    26 
    27     if(*(pattern + 1) == '*')
    28     {
    29         if(*pattern == *str || (*pattern == '.' && *str != ''))
    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 != ''))
    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.
    ");
    55     else
    56         printf("FAILED.
    ");
    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
  • 相关阅读:
    如何提高PHP执行效率
    PHP MySQL 预处理语句
    CDN拾遗
    Rendering React components to the document body
    模拟select,隐藏下拉列表的几种实现
    前端数据范式化
    其实我们可以少写点if else和switch
    [译]the cost of javascript in 2018(1)
    provisional headers are shown 知多少
    f5到底刷新了点什么,你知道吗
  • 原文地址:https://www.cnblogs.com/acm-jing/p/10410362.html
Copyright © 2011-2022 走看看