LeetCode:Regular Expression Matching
mplement 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刚开始的时候,想的过于简单,就按照一般的比较方法,但是其实特殊性在于.*,想当然的认为前面匹配了,出现了.*就都是正确的。没有细致思考。
但是如果构造自动机感觉略复杂,而且不同的输入p,你想要构造自动机的话,这样过于复杂。所以利用递归就可以了。其实这个里面最特殊的就只有*这个字符,因为可以代表0个或者n个字符。sPoint和pPoint类似于指针。
分为2种情况:
1、pPoint + 1指向的是*时,pPoint 指向内容和sPoint指向内容相等,就可以测试*到底是代替多少个字符。当跳出循环就可以返回结果了。
2、就是剩下所有情况。pPoint和sPoint内容相同,或者pPoint为’.’就可以把sPoint和pPoint都向前移一格。
在提交后,发现还有输入待对比字符串为空的时候的这种特殊情况。
public class Solution {
public boolean isMatch(String s, String p) {
char[] s1 = s.toCharArray();
char[] s2 = p.toCharArray();
int pStr1 = 0;
int pStr2 = 0;
return isRegularMatching(s1,s2,pStr1,pStr2);
}
public boolean isRegularMatching(char[] s,char[] p,int sPoint,int pPoint)
{
int sLength = s.length;
int pLength = p.length;
if(pLength == 0&&sLength == 0)return true;
else if(pLength == 0) return false;
else if(sLength == 0)
{
if((pPoint+1<pLength&&p[pPoint+1]=='*'))
{
if(pPoint + 2 == pLength)return true;
else
{
return isRegularMatching(s,p,sPoint,pPoint+2);
}
}
}
if(pPoint == pLength ) return sPoint == sLength;
//if(sPoint == sLength) return pPoint == pLength;
if(pPoint+1<pLength&&p[pPoint+1] == '*')
{
while((sPoint<sLength&&p[pPoint]=='.')||(sPoint<sLength&&pPoint<pLength&&s[sPoint] == p[pPoint]))
{
if(isRegularMatching(s,p,sPoint,pPoint+2))return true;
sPoint++;
}
return isRegularMatching(s,p,sPoint,pPoint + 2);
}
else if((sPoint<sLength&&p[pPoint]=='.')||(sPoint<sLength&&pPoint<pLength&&s[sPoint] == p[pPoint]))
{
return isRegularMatching(s,p,sPoint+1,pPoint+1);
}
return false;
}
}