题目描述:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
首先 因为下一位的出现的可能性有 字符 * 。 三种情况
因此考虑递归是最便捷的方法
确定递归出口:
必须要str 和 pattern 同时走到尾部 为 true
其他情况 无论str先走完 还是pattern 先走完 都为false
根据下一位是否为 * 可以分为以下两种情况:
如果不是 :
*str==*pattern 或者 *pattern == ‘.’
这样的情况说明当前字符匹配 同时向后走一位
如果是 : 根据 * 匹配的位置仍要分情况考虑
1. 源字符串的第一位 与 模式传中 * 后一位匹配
abcdef 与 a * abcdef
此时递归的处理就是将 match_core(str,pattern+2);
2.源字符的第二位 与 模式串中 * 前一位匹配
aabc 与 a * abc a
此时递归的处理就是将 match_core(str + 1,pattern);
3.源字符的第二位 与 模式串中 * 后一位匹配
abc 与 a * bc b
此时递归的处理就是将 match_core(str + 1,pattern + 2);
class Solution {
public:
bool match(char* str, char* pattern)
{
if (str == nullptr || pattern == nullptr)
return false;
return match_core(str, pattern);
}
bool match_core(char* str, char* pattern)
{
//寻找递归出口
//也就是说 str和pattern同时走到尾部
if (*str == '\0'&&*pattern == '\0')
return true;
if (*str != '\0'&&*pattern == '\0')
return false;
if (*str == '\0'&&*pattern != '\0')
return false;
//pattern的下一位是*
//三种情况: 匹配0 匹配 1 匹配 2+
//如果下一位不是* 直接接下去匹配
if ((*str == *pattern) || *pattern == '.')
{
return match_core(str + 1, pattern + 1);
}
if (*(pattern + 1) == '*')
{
//‘。’可以代表任何字符
if ((*str == *pattern) || *pattern == '.')
{
return match_core(str, pattern + 2) || match_core(str + 1, pattern) || match_core(str + 1, pattern + 2);
}
else
{
return match_core(str, pattern + 2);
}
}
return false;
}
};