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