题目描述
请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配
昨天晚上提交不通过,今天提交就能通过,也是服了。
题目明显可以实用递归进行求解,注意一下几种情况,
1、pattern中出现连续两个‘*’或者开头就是”*”的直接返回false,因为这不是正确的正则表达式。
2、如果pattern到达末尾,那么str必须到达末尾,否则直接返回不匹配
3、如果pattern没有达到末尾,但是str到达末尾,则需要单独判断之后的pattern是否是连续出现两个非“*”如果是返回false,直到遍历到pattern末尾返回true
4、对于其他情况,如果对应的pattern第二个字符不是“*”,那么直接比对当前字符,不匹配直接返回false,匹配的话pattern和str都向前加1;
5、如果对应的pattern第二个字符是‘*’那么分为以下几种情况
如果当前字符是不匹配的:
- 可以直接将pattern后移两个字符,对应的*是代表前面出现0次的情况
如果当前字符是匹配的:
- str直接向后移动一个,对应的*是出现2次以上的情况
- 可以直接将pattern后移两个字符,对应的*是代表前面出现0次的情况
- str向后移动一个,pattern向后移动2个,代表*前面的字符只出现1次的情况
class Solution {
public:
bool match(char* str, char* pattern)
{
if(*pattern=='*')
return false;
char* patt=pattern;
while(*patt!='\0')
{
if(*patt=='*'&&*(patt+1)=='*')
return false;
else
++patt;
}
return recurmatch(str,pattern);
}
bool recurmatch(char* str, char* pattern)
{
if(*pattern=='\0'&&*str=='\0')
return true;
else if(*pattern=='\0'&&*str!='\0')
return false;
else if(*pattern!='\0'&&*str=='\0')
return judgepatt(pattern);
if(*(pattern+1)!='*')
{
if(*str==*pattern||*pattern=='.')
return recurmatch(str+1, pattern+1);
else
return false;
}
if(*pattern==*str||*pattern=='.')
return recurmatch(str+1, pattern)||recurmatch(str, pattern+2)||recurmatch(str+1, pattern+2);
return recurmatch(str, pattern+2);
}
bool judgepatt(char *patt){
while(*patt!='\0')
{
if((*patt!='*')&&(*(patt+1)!='*'))
return false;
++patt;
}
return true;
}
};