思路:分两种情况,即模式串的第二个字符是不是‘*’
(1)当第二个字符不是‘*’的时候,直接看当前字符和模式串是否相等或者模式串的当前字符是否为 ‘.’
如果是就匹配下一个,否则直接返回false
(2)当第二个字符是' * '的时候,如果模式串的当前字符和字符串的当前字符是匹配的,分为三种情况继续匹配
1) * 前面的字符出现0次,则匹配模式串的后两位,即有match(str, pattern + 2)
2) * 前面的字符出现1次,则字符串后移1位, 模式串后移两位、
3)*前面的字符串出现2次或者两次以上,则模式串不动,字符串后移1位。
举个例子,字符串abc 模式串是a*bc
* 号前的a匹配成功了,如果 * 前面的a 出现0次,那么patern + 2,即模式串跳到b 去和字符串的a 匹配
如果 * 前面的a 出现1次,那么pattern + 2,str+1,即字符串跳到下一位即b,模式串跳到下两位即b去继续匹配
如果 * 前面的a 出现2次或者2次以上,即题目说的任意次,多次,那么str + 1,pattern 保持不变(因为*前面还剩下很多个a)。即字符串的b和模式串的a继续匹配。
class Solution {
public:
bool match(char* str, char* pattern)
{
if(str == nullptr || pattern == nullptr)
return false;
return checkmore(str, pattern );
}
bool checkmore(char * str, char * pattern )
{
if(*str == '\0' && *pattern == '\0')
return true;
if(*str != '\0' && *pattern == '\0')
return false;
if(*(pattern + 1) == '*')//第二个字符是'*'
{
if(*pattern == *str || ( *pattern == '.' && *str != '\0'))//*前面的字符匹配成功
{
return checkmore(str, pattern + 2) || //*前面的字符出现0次
checkmore(str + 1, pattern + 2) ||//*前面的字符出现1次
checkmore(str + 1, pattern);//*前面的字符出现多次
}
else
return checkmore(str, pattern + 2);//*前面的字符匹配失败,模式串串左移2位
}
//第二个字符不是*且当前字符匹配成功的时候
if(*pattern == *str || (*pattern == '.' && *str != '\0'))
return checkmore(str +1, pattern + 1);
//第二个字符不是*且当前字符匹配失败的时候
return false;
}
};