题目:
实现包含.的正则表达式匹配
思路:
分3种情况,1正常字符;2是.;3是;
难点:
1、如何判断当前字符是否匹配?可能出现哪些情况?
当前字符如果匹配,那么要考虑带‘.’和不带‘.’两种情况,判断如下
if(*str==*pattern || *str!='\0' && *pattern=='.')
返回true说明当前字符匹配,返回false说明当前字符不匹配
2.、 出现*如何处理?
- 在判断当前字符匹配的时候,先判断pattern下一个字符是不是,如果是 ,用进入的处理逻辑;不是,则是一种简单的情况,只判断当前的字符是否匹配就可以了
- 重点说一说*的处理逻辑,*出现,说明前面的字符可以匹配0次,1次,多次,于是要讨论这三种情况如何用代码表示,匹配0次,则str不变,pattern+2;匹配一次,则str+1,pattern+2;匹配多次,则str+1,pattern不变。以上是当前字符匹配的情况。若当前字符不匹配,那肯定是pattern匹配0次。
3、 最后整个字符串匹配成功的话应该怎么判断? - 两个都到了结尾,说明匹配完成,返回true
- pattern到了结尾,str没到结尾,说明匹配失败,返回false(易考虑不到)
- 对应的,是不是str到了结尾,pattern没到结尾也代表匹配失败呢?答案是不是,因为pattern可能出现带的情况,这样也是有可能匹配成功的,若没出现带的情况,处理逻辑中会拿str==‘\0’去与pattern作比较,会返回false,因此str到结尾,pattern还没到结尾并不能作为字符串匹配结束的判断依据
代码:
class Solution {
public:
bool match(char* str, char* pattern)
{
if(str==nullptr||pattern==nullptr)//判断方法情况
return false;
if(*str=='\0' && *pattern=='\0')//判断匹配成功的情况
return true;
if(*str!='\0' && *pattern=='\0')//判断匹配失败的情况
return false;
if(*(pattern+1)=='*'){//处理有*的情况
if((*str!='\0' && *pattern=='.') || *str==*pattern)
return match(str+1,pattern)||match(str+1,pattern+2)||match(str,pattern+2);//当前字符匹配,处理匹配多次、1次、0次的情况
else
return match(str,pattern+2);//当前不匹配的情况
}
else{//处理没*的情况
if(*str!='\0' && *pattern=='.' || *str==*pattern)
return match(str+1,pattern+1);//匹配
else
return false;//不匹配
}
}
};
网友评论