Problem:
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
Solution:
多种方法解决,可以用DFS,也可以用DP,参考这里:http://blog.csdn.net/hcbbt/article/details/44016237
题目大意:
给定一个字符串和一个正则表达式,给出正则是否匹配字符串
解题思路:
关键问题在*上面,*可以占用零个或者多个位置,因此用DFS的办法就是尝试遍所有的可能匹配的情况,比如AAAAAB和A*B,就要看AAAAAB和B还有AAAB和B和AB和B
Java源代码(用时302ms):
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; } }
C语言源代码(用时21ms):
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; }
C++源代码(用时407ms):
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; } };
Python源代码(调用自带函数用时140ms):
class Solution: # @param {string} s # @param {string} p # @return {boolean} def isMatch(self, s, p): return re.match('^' + p + '$', s) != None
Python源代码(DFS超时):
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
时间: 2024-10-06 02:39:18