当模式中的第二个字符不是“*”时:
1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。
2、如果 字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。
而当模式中的第二个字符是“*”时:
如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配。如果字符串第一个字符跟模式第一个字符匹配,可以有3种匹配方式:
1、模式后移2字符,相当于x*被忽略;
2、字符串后移1字符,模式后移2字符;
3、字符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位;
class Solution {
public:
bool match(char* str, char* pattern)
{
if (*str == '\0' && *pattern == '\0')return true;
if (*pattern == '\0')return false;
//模式串下一个字符不是'*'
if(*(pattern + 1) != '*')
{
//查看当前位置是否匹配
if(*str == *pattern || (*str != '\0' && *pattern == '.'))
return match(str + 1, pattern + 1);//匹配的话进行下一个字符比较
else
return false;//不匹配则返回错误
}else//模式串下一个字符是'*'
{
//查看当前位置是否匹配
if (*str == *pattern || (*str != '\0' && *pattern == '.'))
//1、匹配一个 2、不想匹配 3、 可能可以匹配多个,仅字符串走一步即可
return match(str + 1, pattern + 2) || match(str, pattern + 2) || match(str + 1, pattern);
else
return match(str, pattern + 2);//不匹配,模式串走两步
}
}
};