题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
class Solution {
public:
bool match(char* str, char* pattern)
{
if(str==NULL || pattern ==NULL)
return false;
return choose(str,pattern);
}
bool choose(char* str, char* pattern)
{
/*
if(*str == '\0' && *pattern =='\0')
return true;
if(*str !='\0' && *pattern =='\0')
return false;
if(*(pattern+1)=='*')
{
if(*str==*pattern || (*pattern =='.'&& *str!='\0'))
{
return choose(str+1,pattern+2) || choose(str+1,pattern) ||choose(str,pattern+2);
// 与当前*匹配 认为*是一次 || 与当前 *匹配 认为* 多次 ||不匹配 跳下一个模式
}
else
return choose(str,pattern+2);
}
if(*str==*pattern || (*pattern =='.'&& *str!='\0'))
{
return choose(str+1,pattern+1);
}
return false;
*/
//以下是自己想法 有些冗余 上面是剑指的思路
while(*str!='\0')
{
if(*pattern == *str )
{
str++;
if( *(pattern+1)=='*')
return choose(str,pattern)||choose(str,pattern+2)||choose(str-1,pattern+2);
pattern ++;
}
else if(*pattern =='.' && *(pattern+1)=='*')
{//遇到.*可以选择停留 或者跳过两个字符
str++;
return choose(str,pattern) || choose(str,pattern+2)||choose(str-1,pattern+2);
//if( *(pattern+1)!='*')
// pattern++;
//str++;
}
else if(*pattern =='.')
{
str++;
pattern++;
}
else if(*(pattern+1)=='*')
{
pattern+=2;
}
else
return false;
}
while(*pattern !='\0')
{
if(*(pattern+1)=='*')
pattern+=2;
else
return false;
}
return true;
}
};