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) != None
class 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 False
LeetCode 10 Regular Expression Matching (C,C++,Java,Python)
原文地址:http://blog.csdn.net/runningtortoises/article/details/45566403