剑指Offer(牛客版)--面试题19:正则表达式匹配
题目: 请实现一个函数用来匹配包含’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但与”aa.a”及”ab*a”均不匹配。
分析:
完整代码:
class Solution {
public:
bool match(char* str, char* pattern)
{
//检查输入的合法性
if(str ==nullptr && pattern ==nullptr)
return false;
return mathCore(str, pattern);
}
private:
bool mathCore(const char *str, const char *pattern)
{
//如果字符串和模式都遍历到结尾
if(*str =='\0' && *pattern == '\0')
//匹配成功
return true;
//如果字符串没有遍历到结尾,而模式遍历到结尾
if(*str !='\0' && *pattern == '\0')
//匹配不成功
return false;
//如果模式的第二个字符的是 "*"
if (*(pattern + 1) == '*')
{
//如果字符串和模式的第一个字符相匹配或者字符串没有遍历到结尾,模式的第一个字符为 "."
if (*str == *pattern || (*str != '\0' && *pattern == '.'))
return mathCore(str +1 , pattern + 2)|| mathCore(str +1 , pattern)|| mathCore(str , pattern +2);
else
return mathCore(str , pattern +2);
}
/**********如果模式的第二个字符不是 "*"**************/
//如果字符串和模式的第一个字符相匹配或者字符串没有遍历到结尾,模式的第一个字符为 "."
if (*str == *pattern || (*str != '\0' && *pattern == '.'))
return mathCore(str + 1, pattern + 1);
//至此,则匹配失败
return false;
}
};