1、递归的灵活运用,尤其是多种情况下如何递归返回
2、字符串的基本性质:char* str 向后移动不能str++,必须str+1
3、各种情况考虑必须严谨,不然很容易漏掉一些可能通过的匹配模式,比如:
(1)'*'前字符相同也可以跳过不匹配;(2)pattern为'.'时要匹配还需要此时str不为'\0'
class Solution {
public:
bool match(char* str, char* pattern)
{
if(!str || !pattern) {
return false;
}
return matchCore(str, pattern);
}
bool matchCore(char* str, char* pattern) {
if(*str == '\0' && *pattern == '\0') //字符串和模式串同时走完了,返回true
return true;
if(*str != '\0' && *pattern == '\0') //模式串先走完了,字符串没走完,返回false;字符串走完模式串没走完还可能是true!
return false;
//把当前所有可能的匹配情况列写完整,进行下一步递归判断
if(*(pattern+1) == '*') { //模式串当前字符的下一个是'*'
//*前字符 与 str当前字符匹配,还有三种可能
if(*pattern == *str || (*str != '\0' && *pattern == '.')) {
return (matchCore(str+1, pattern+2) //*前字符用一次就跳过
|| matchCore(str+1, pattern) //*前字符用>1次(这个是我没想到的难点!!!)
|| matchCore(str, pattern+2)); //*前字母一次不用(这个是很容易很容易漏掉的点,总认为匹配上了str就要后移一位)
//比如 "abc" "ab*bc",第一个'*'前的'b'匹配了对应位置的'b',但还是要跳过
}
//*前字符 与 str当前字符不匹配,只有跳过这一种可能了
else { //不需要加判断
return matchCore(str, pattern+2);
}
}
else{ //模式串当前字符的下一个不是'*'
if((*str == *pattern) || (*pattern == '.' && *str != '\0'))
return matchCore(str+1, pattern+1); //当前字符满足,继续递归向后判断 //Bug:str++会时间溢出,改成str+1才对!语法错误
}
//当前就不匹配,不必递归直接返回false
return false;
}
};