题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
测试用例:
aaa a*aaa
abbbc ab*c
abc ab*c
abcaaab a.*a.b
解题思路:
问题的核心在于对“*”的情况分析。
如果当前字符的下一个字符不是“*”,那么如果当前字符不匹配就返回失败,否则递归下一个字符位置。
如果当前字符的下一个字符是“*”,那么需要考虑两种情况:1.匹配0个,不管当前字符是否相同,都需要pattern+2向后走2个字符; 2.匹配一个或者匹配多个,那么当前字符肯定是相同的,我们让str+1向后走1个字符,匹配一个的就变成匹配0个的情况,匹配多个的只需要一直向后匹配即可。
class Solution { public: bool match(char* str, char* pattern) { //同时走到尾部表示匹配成功 if(*str == ' ' && *pattern == ' ') return true; //如果字符串没有结束,模式串结束了,则表示匹配失败 //如果模式串没有结束,而字符串结束了,那么还有可能是匹配0个的情况存在 if(*str != ' ' && *pattern == ' ') return false; //根据当前字符的下一个字符判断是否是* if(*(pattern+1) != '*'){ if(*str == *pattern || ( *str != ' ' && *pattern == '.' )){ return match(str+1, pattern+1); }else{ return false; } }else{ if(*str == *pattern|| ( *str != ' ' && *pattern == '.' ) ){ //即使当前字符相同,也可以匹配0个 bool matchZero = match(str, pattern+2); //匹配一个和多个算是一种情况,匹配一个在下次递归中会转化成匹配0次的情况 bool matchOneMulti = match(str+1, pattern); return matchZero || matchOneMulti; }else{ //匹配0个的情况 return match(str, pattern+2); } } } }