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
public class Solution {
    public boolean isMatch(String s, String p) {
        char[] chs = s.toCharArray();
        char[] chp = p.toCharArray();
        return Match(chs,0,chp,0);
    }
    public boolean Match(char[] chs,int index1,char[] chp,int index2){
        if(index2>=chp.length)return index1>=chs.length;
        if(index2+1<chp.length && chp[index2+1]=='*'){
            while(index1<chs.length && (chp[index2]=='.' || chp[index2]==chs[index1])){
                if(Match(chs,index1,chp,index2+2))return true;
                index1++;
            }
            return Match(chs,index1,chp,index2+2);
        }else if(index1<chs.length && (chp[index2]=='.' || chs[index1]==chp[index2])){
            return Match(chs,index1+1,chp,index2+1);
        }
        return false;
    }
}bool isMatch(char* s, char* p) {
    if(s==NULL || p==NULL)return false;
    if(!*p) return !*s;
    if(*(p+1)=='*'){
        while((*p==*s)||(*s && *p=='.')){
            if(isMatch(s,p+2))return true;
            s++;
        }
        return isMatch(s,p+2);
    }else if((*p==*s)||(*s && *p=='.')){
        return isMatch(s+1,p+1);
    }
    return false;
}
class Solution {
public:
    bool isMatch(string s, string p) {
        return Match(s,0,p,0);
    }
    bool Match(string s,int index1,string p,int index2){
        if(index2>=p.size())return index1>=s.size();
        if(index2+1<p.size() && p[index2+1]=='*'){
            while(index1<s.size() && (p[index2]=='.' || p[index2]==s[index1])){
                if(Match(s,index1,p,index2+2))return true;
                index1++;
            }
            return Match(s,index1,p,index2+2);
        }else if(index1<s.size() && (p[index2]=='.' || p[index2]==s[index1])){
            return Match(s,index1+1,p,index2+1);
        }
        return false;
    }
};class Solution:
    # @param {string} s
    # @param {string} p
    # @return {boolean}
    def isMatch(self, s, p):
        return re.match('^' + p + '$', s) != Noneclass Solution:
    # @param {string} s
    # @param {string} p
    # @return {boolean}
    def isMatch(self, s, p):
        return self.Match(s,0,p,0)
    def Match(self,s,index1,p,index2):
        if index2>=len(p):return index1>=len(s)
        if index2+1<len(p) and p[index2+1]=='*':
            while index1<len(s) and (p[index2]=='.' or p[index2]==s[index1]):
                if self.Match(s,index1,p,index2+2):return True
                index1+=1
            return self.Match(s,index1,p,index2+2)
        elif index1<len(s) and (p[index2]=='.' or p[index2]==s[index1]):
            return self.Match(s,index1+1,p,index2+1)
        return FalseLeetCode 10 Regular Expression Matching (C,C++,Java,Python)
原文地址:http://blog.csdn.net/runningtortoises/article/details/45566403