时间限制:1秒
空间限制:32768K
热度指数:32774
本题知识点:字符串
题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
思路:采用递归的方法。
1. 只有当str和pattern同时为'\0'时,才算成功。
2. 当*str == *pattern 或者 *pattern == '.' && *str != '\0' 时,我们就认为当前str和pattern是匹配的。
3. 每一轮,我们首先应该考虑pattern+1是不是'*',接着才是考虑当前str和pattern是否匹配,如果pattern+1是'*':
3.1. 如果当前str和pattern匹配,此时'*'的作用可能还没有结束,还要考虑以下两种情况(任何一种情况成功都行,所以它们是'或'的关系):
3.1.1: 匹配str+1和pattern(如果这种情况匹配成功,说明这个'*'前面的字符可能要重复两次以上)
3.1.2: 或者匹配str和pattern+2(如果这种情况匹配成功,说明这个'*'前面的字符需要被忽略)
3.2. 如果当前str和pattern不匹配,那么我们还有机会,忽略当前pattern和pattern+1,接着匹配当前str和pattern+2;
4. 如果pattern+1不是'*',就正常考虑当前str和pattern是否匹配。
5. 如果3和4都不能返回true,那就只能返回false咯
class Solution { public: bool match(char* str,char* pattern)//程序入口 { if(str == NULL || pattern == NULL) return false; return kernel(str,pattern); } bool kernel(char* str,char* pattern) { if(*str == '\0' && *pattern == '\0') return true; if(*(pattern+1) == '*') { if(*pattern == *str || (*pattern == '.' && *str != '\0'))//如果当前str和pattern匹配 return kernel(str+1,pattern)||kernel(str,pattern+2);//两者任何一个匹配成功都行 else return kernel(str,pattern+2); } if(*str == *pattern || (*pattern == '.' && *str != '\0')) return kernel(str+1,pattern+1); return false; } };