题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
示例1
输入
"aaa","a*a"
返回值
true
C++实现:解决了好久,需要考虑好多种情况
首先:
1.如果*str == *parttern 或者*parttern==‘.’,往下走
2.str=""和pattern=".*"返回true
3.*str != *parttern 但是*(parttern+1) == ‘*’即这个不相等的字符出现0次,那么就可以令parttern向后走两个位置
4.不好解决的情况,判断*重复前面对应字符的个数,比如“aaaab”与“aa*b”,中间的a就重复了3次。
5."bcbbabab",".*a*a" 和 "bbbbba",".*a*a"等情况
class Solution { public: bool match(char* str, char* pattern) { while(*str!='\0'||*pattern!='\0'){ //为了解决"bcbbabab",".*a*a" 和 "bbbbba",".*a*a"等情况(解决了好久) if(*(pattern - 1) == '.'&& *pattern == '*'){ if(*(str - 1) != *str && *(str+1)!='\0') if(*(pattern + 1) == '\0') return false; else pattern++; } if(*str == *pattern || (*str!='\0'&&*pattern == '.')){ //如果匹配,则都向后移动一位 str++; pattern++; }else if(*pattern == '*'){ if(*str=='\0')//str已经匹配完成,返回true,"aaa","a*a" return true; else{ --pattern; //判断是继续循环还是pattern跳到下一个(解决了好久) if(*str == *pattern || (*str!='\0'&&*pattern == '.')){ str++; pattern++; }else{ pattern+=2; } } }else if(*++pattern=='*'){//虽然不匹配但是可以让该字符出现0次,然后pattern向后走 pattern++; }else{ return false; } } return true; } };
还是应该把几种情况想到然后写递归比较简洁
class Solution { public: bool match(char* str, char* pattern) { if(*str == '\0' && *pattern== '\0') return true; if(*str != '\0' && *pattern == '\0') return false; if(*(pattern+1) != '*'){ if(*str == *pattern || (*str != '\0' && *pattern == '.')) return match(str+1,pattern+1); else{ return false; } }else{ if (*str == *pattern || (*str != '\0' && *pattern == '.')) return match(str, pattern+2) || match(str+1, pattern); else return match(str, pattern+2); } } };