这个代码写的比较直觉,写的过程也出现好多细节问题,经过Clion debug调试才找到问题的。
所以写代码光有思路,不调试遇到一些麻烦问题也不好处理。

子结构1:
很好理解,字符相同,或者通配符是?,相互抵消一个字符
if(*p1 == *s1 || *p1 == '?'){
                p1++;
                s1++;
                slen--;
                plen--;
                continue;
            }
子结构2:
如果通配符不满足相等,也不是?,也不是*,那么没必要比下去了。返回false就好。
if(*p1 != '*'){
                return false;
            }

子结构3:
while(plen > 0 && *p1 == '*') {
                plen--;
                p1++;

                if(plen == 0){
                    return true;
                }
            }
通配符剩下的字符全是*,把*清空之后,长度为0,没必要比下去了,直接返回true。因为*匹配任意字符。

子结构4:
if(slen == 0){
                return false;
            }
如果通配符不剩下的不全是*,但是字符串s已经清空了,没必要比较下去了,直接返回false。因为s找不到跟通配符匹配的字符了。

子结构5:
while(slen > 0 && plen > 0){
                if(isMatch(s1,p1)){
                    return true;
                }
                s1++;
                slen--;
            }
双方互有子力,还可以比较。通配符刚刚有star过,那么通配符剩下的部分,跟s的任意子串匹配成功。就直接返回true。*可以匹配任意长度。

子结构6:
通配符刚刚有star过,但是通配符剩下的部分不能跟s的任意子串匹配,没必要比较了,直接返回false。
return false;

子结构7:
前面已经把通配符匹配过了,通配符不全是*,并且该匹配的字符也消掉了。双方剩下的子力字符都还存在,无法抵消。返回false
return slen == 0 && plen == 0;


class Solution {
public:
    bool isMatch(const char *s, const char *p) {
        int slen = strlen(s);
        int plen = strlen(p);
        const char *s1 = s;
        const char *p1 = p;
        while(slen > 0 && plen > 0){
            if(*p1 == *s1 || *p1 == '?'){
                p1++;
                s1++;
                slen--;
                plen--;
                continue;
            }

            if(*p1 != '*'){
                return false;
            }

            while(plen > 0 && *p1 == '*') {
                plen--;
                p1++;

                if(plen == 0){
                    return true;
                }
            }

            if(slen == 0){
                return false;
            }

            while(slen > 0 && plen > 0){
                if(isMatch(s1,p1)){
                    return true;
                }
                s1++;
                slen--;
            }

            return false;
        }

        while(plen > 0 && *p1 == '*'){
            plen--;
            p1++;

            if(plen == 0){
                return true;
            }
        }

        return slen == 0 && plen == 0;
    }
};