这个题目本质上是一个递归题,无奈我的脑子转的太慢,存储能力太差,只好把所有情况列在本子上,而且还少考虑了很多,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; } } };