您的位置:首页 > 编程语言 > C语言/C++

LeetCode 10 Regular Expression Matching (C,C++,Java,Python)

2015-05-07 21:02 513 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: