题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
分析:想到的方法就是递归了。首先模式的第二个字符是’*’时,若str字符和模式字符相等或str字符不为’\0’且模式字符为’.’,递归返回三种情况的或值。情况1,模式*之前的字符出现0次,则str,pattern+2;情况2. 模式*之前的字符出现1次,则str+1,pattern+2;情况3 模式*之前的字符出现2次以上,则str+1,pattern;否则str既不和模式字符相等也不满足tr字符不为’\0’且模式字符为’.’的情况,只能按*之前的字符出现0次算了,即str,pattern+2。
模式的第二个字符不为’*’时,若str字符和模式字符相等或str字符不为’\0’且模式字符为’.’,则str+1,pattern+1;否则返回false;
递归出口:当str字符和模式字符都为’\0’,返回true;当str字符不为’\0’且模式字符为’\0’时返回false;
程序:
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,pattern+2)||match(str+1,pattern+2)||match(str+1,pattern);
else return match(str,pattern+2);
}
if(*str==*pattern||*str!='\0'&&*pattern=='.') return match(str+1,pattern+1);
return false;
}