天天看點

正規表達式.和*實作

遠景面試筆試題,實作正規表達式中的. 和 *

測試案例 match("aa","aa") false

match("aa","aa") true

match("aa","a*") true;

match("aab",".*b"); true

match("aab","c*a*b") true  

#include<cstdio>
using namespace std;
class Solution {
public:
    bool match(char* str, char* pattern)
    {
//        puts(str);
//        puts(pattern);
        if(str==NULL && pattern==NULL)
            return true;
        if(str==NULL || pattern==NULL)
            return false;
        return matchCore(str,pattern);
    }
    bool matchCore(char *str,char *pattern)
    {
        if(*str=='\0' && *pattern=='\0') {return true;}
        if(*str!='\0' && *pattern=='\0') return false;
        if(*(pattern+1)=='*')
        {
            if(*str==*pattern || (*pattern=='.'&&*str!='\0'))
            {
                //move on the next state
                return matchCore(str+1,pattern+2)
                //stay on the current state
                || matchCore(str+1,pattern)
                //ignore a '*'
                || matchCore(str,pattern+2);
            }
            else return matchCore(str,pattern+2);
        }
        if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
        {
            return matchCore(str+1,pattern+1);
        }
        return false;
    }
};
int main()
{
    char ch1[]="";
    char ga1[]="";
    char *ch=ch1;
    char *ga=ga1;
    Solution so;
    if(so.match(ch,ga))printf("true\n");
    else printf("false\n");
    return 0;
}
           

繼續閱讀