这个题目本质上是一个递归题,无奈我的脑子转的太慢,存储能力太差,只好把所有情况列在本子上,而且还少考虑了很多,wa了很多遍。再练习一下寻找感觉吧。不怎么指望自己能够在脑子里面算出所有情况,还是写下来吧。
我的大致思路是分类,首先分成当前字符相等|不相等两个情况,然后在相等的情况里面,分为两者都是空字符串|不是空字符串,不是空字符串又分为下一个符号是|不是*。
在不相等的情况里面,又分为str为空|不为空。str为空的情况又分为pattern的下一个字符为
|不为
str不为空的情况又包含了pattern为空(即没有下一个符号)|pattern有下一个符号。
pattern有下一个符号的情况又分为下一个符号是
|下一个符号不是
pattern下一个符号是'
'又分为pattern当前的符号是'.'|不是点
pattern下一个符号不是''又分为pattern当前的符号是'.'|是''|是其他符合。

可能我分类的复杂化了,代码的多少完全看要从哪个角度分类。隐约感觉从:pattern没有下一个符号|下一个符号为''|下一个元素不为''的角度入手能简化问题。

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(*str==*pattern){
            if(*str=='\0') return true;
            if(*(pattern+1)=='*')
                return match(str+1,pattern)||match(str+1,pattern+2)||match(str,pattern+2);
            else{
                return match(str+1,pattern+1);
            }
        }
        else{
            if(*str=='\0'){
                if(*(pattern+1)=='*') return match(str,pattern+2);
                if(*pattern=='*') return match(str,pattern+1);
                return false;
            }
            else{
                if(*pattern=='\0') return false;
                if(*(pattern+1)=='*'){
                    if(*pattern=='.'){
                       // *pattern=*str;
                        bool t1=match(str+1,pattern);
                        //*pattern='.';
                        bool t2=match(str,pattern+2);
                        bool t3=match(str+1,pattern+2);
                        return t1||t2||t3;
                    }
                    return match(str,pattern+2);
                }
                else{
                    if(*pattern=='.') return match(str+1,pattern+1);
                    if(*pattern=='*') return match(str,pattern+1);
                    return false;
                }
            }
        }
    }
};

2)按照pattern下一个符号来分类:
(1)没有下一个符号,即pattern为空
(2)下一个符号是''
(3)下一个符号不是'
'
这个思路虽然没有比上面的思路少多少行,但是if语句的确少了一点,清晰很多。
代码如下:

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(*pattern=='\0'){
            if(*str=='\0') return true;
            return false;
        }
        if(*(pattern+1)=='*'){
            if(*pattern=='.'){
                if(*str=='\0') return match(str,pattern+2);
                else return match(str+1,pattern)||match(str,pattern+2);
            }
            if(*pattern=='*'){
                return match(str,pattern+2);
            }
            if(*pattern==*str) return match(str+1,pattern+2)||match(str+1,pattern)||match(str,pattern+2);
            return match(str,pattern+2);
        }
        else{
            if(*pattern=='.'){
                if(*str=='\0') return 0;
                return match(str+1,pattern+1);
            }
            if(*pattern=='*') return match(str,pattern+1);
            if(*pattern==*str) return match(str+1,pattern+1);
            return 0;
        }
    }
};