Regular Expression Matching

'.' 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") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

'.' 匹配一个任意字符,‘*’前一个字符出现0次或者多次,A* 即“”,A, A* 三种情况,


解法:

s代表当前待匹配字符串指针,p代表当前待匹配模式的指针;

  1. *p=='\0' 即 模式已经到尾部,返回*s=='\0' ,即返回字符串s是否已经到尾部

如果*p!='\0'也即是模式没有达到末尾,这里要看p+1是否为’*‘

2.*(p+1)=='*',

a.字符*p出现0次,即匹配(s,p+2),matchcore(s,p+2) 

b.字符出现至少一次时,isequal(s,p)&&mathcore(s+1,p);


3.*(p=1)!=’*‘

 查看当前字符是否匹配,如果不匹配,返回false,否则返回s+1,p+1的匹配结果

 bool isequal(char ch,char ch1){

        return ch==ch1||ch1=='.'&&ch!='\0';

    }

    bool matchcore(const char *s,const char* p){

        

      if(*p=='\0')

return *s=='\0';

        if(*(p+1)=='*'){

if(matchcore(s,p+2))

return true;

if(isequal(*s,*p)&&matchcore(s+1,p))

return true;

        }

        else{

            if(isequal(*s,*p))

                return matchcore(s+1,p+1);

return false;

        }

    }

    bool isMatch(string s, string p) {

        if(p==".*")

            return true;

        

        int lena=s.length();

        int lenb=p.length();

        

        return matchcore(s.c_str(),p.c_str());

        

    }



方法2 DP

你可能感兴趣的:(function,character,Examples,matching,entire)