题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
思路:首先处理两个指针均属于NULL,此时返回true;其次进行字符串的判断流程,关键点是判断当前所指字符的下一个字符是否为'*'
若是,则进行*匹配的判断,如果char和pattern当前所指字符相匹配(分带‘.’匹配和字母匹配两种),则用递归进行求解(其中有三种匹配形式,分别为0匹配,至少匹配一个字符,只匹配一个字符);如果char和pattern当前所指字符不匹配,则*只能看做0匹配,并进行下一步的递归;
若当前字符的下一个字符不是‘*’,则直接比较char和pattern当前所指字符是否相匹配(分带‘.’匹配和字母匹配两种),若是则递归调用下一步,若不是则返回false;
代码:
class Solution { public: bool match(char* str, char* pattern) { if(str == NULL && pattern == NULL) //deal with the special case return true; return matchCore(str, pattern); } bool matchCore(char* str, char* pattern) { if(*str == '\0' && *pattern == '\0') //match finished return true; if(*str != '\0' && *pattern == '\0') //pattern finished and match failed return false; if(*(pattern + 1) == '*') { //if pattern pointer next is '*' if(*pattern == *str || (*pattern == '.' && *str != '\0')) //pattern and str matched now return matchCore(str + 1, pattern + 2) || //'*' used as one char finished, both to next match matchCore(str + 1, pattern) || //'*' use as one char at least, str move to next matchCore(str, pattern + 2); //'*' used as non char, str no move else return matchCore(str, pattern + 2); //pattern and str doesn't match now, //'*' used as non char, str no move } if(*str == *pattern || (*pattern == '.' && *str != '\0')) return matchCore(str + 1, pattern + 1); return false; } };