10. Regular Expression Matching

Implement regular expression matching with support for '.' and '*'.

'.' 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,1,2,...次,所以要使用到带回溯的递归

bool backTracking(char* s, char* p, int p1, int p2){
    while(p[p2] != ''){//when s ends, p maybe not end, Eg: p left a*, it also should return true.So the end condition is p = ''
        if(p[p2+1] == '*'){
            while(s[p1] == p[p2] || (p[p2] == '.'  && s[p1] != '')){//'.' matches all letters except ''
              if(backTracking(s,p,p1,p2+2)) return true; 
              p1++;
            } 
            p2+=2;
        }
        else if(s[p1] == p[p2] || (p[p2] == '.'  && s[p1] != '')){ 
            p1++;
            p2++;
        }
        else return false;
    }
    if(s[p1] == '') return true; //when p ends, s must end
    else return false;
}

bool isMatch(char* s, char* p) {
    return backTracking(s,p,0,0);
}
原文地址:https://www.cnblogs.com/qionglouyuyu/p/5366402.html