题目描述
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
算法分析
初看题目比较复杂,因为有好多种可能匹配的情况,所以需要分多种情况进行讨论,题目的难点在于字符 ‘*’,导致匹配复杂程度的增加,为此分为以下两种情况
1. 下一个字符不是 ‘*’
这种情况比较简单,直接比较当前字符即可
2. 下一个字符是 ‘*’
2.1 字符串的当前字符 和 模式的当前字符不相等
模式: *pattern = pattern + 2*
字符串:*str不变*
即 ‘*’ 前面的字符出现 0 次
2.2 字符串的当前字符 和 模式的当前字符相等
2.2.1 ‘*’ 前面的字符出现 0 次
模式: *pattern = pattern + 2*
字符串:*str不变*
2.2.2 ‘*’ 前面的字符出现 1 次
模式: *pattern = pattern + 2*
字符串:*str = str + 1*
2.2.3 ‘*’ 前面的字符出现 多 次
模式: *pattern不变*
字符串:*str = str + 1*
程序代码
注意递归出口的条件
class Solution {
public:
bool match(char* str, char* pattern)
{
//特殊情况
if(str==nullptr || pattern==nullptr)
return false;
return MatchCore(str,pattern);
}
bool MatchCore(char* str, char* pattern)
{
//递归出口
//注意:*str=='\0' && *pattern!='\0'的情况,此时仍然有可能匹配成功,因为模式‘*’前的字符可以有0次
if(*str!='\0' && *pattern=='\0')
return false;
if(*str=='\0' && *pattern=='\0')
return true;
if(*(pattern+1) != '*')//下一个字符不是‘*’
{
if(*str==*pattern || (*pattern=='.' && *str!='\0'))//注意*str的限定条件
return MatchCore(str+1, pattern+1);
else
return false;
}
else//下一个字符是‘*’
{
bool Same = false;
if(*str==*pattern || (*pattern=='.' && *str!='\0'))//注意*str的限定
Same = MatchCore(str, pattern+2)
|| MatchCore(str+1, pattern+2)
|| MatchCore(str+1, pattern);
else
Same = MatchCore(str, pattern+2);
return Same;
}
}
};