题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
分析
基本的函数使用递归,在函数调用过程中,总共可分为以下几种情形:
假设目标字符串 是 str ,匹配字符串是 pattern
1、如果pattern第二个字符不是 ‘*’,那么只要对比下第一个字符,然后递归比对后续字符,即str+1 和 pattern+1
2、如果第二个字符是'*',那么
(1)如果pattern和str第一个字符相同,以下两种情况满足一种即可
一、 递归比对pattern+2后续字符,即str 和 pattern+2
二、 递归比对str+1后续字符,即str+1 和 pattern
(2)如果pattern和str第一个字符不相同,也就是使用*作为取消字符用,
递归比对pattern后续字符,即str 和 pattern+2
另外需要特殊处理字符长度只有1的情形
代码实现
bool match(char* str, char* pattern )
{
if( strlen(str)<=0 && strlen(pattern)<=0)
return true;
if( strlen(str)<=0){
if(strlen(pattern)<=1)
return false;
else{
if(pattern[1]=='*')
return match(str,pattern+2 );
else
return false;
}
}
if( strlen(pattern)==1 ){
return ( strlen(str)==1 ) && (pattern[0]==str[0]|| pattern[0]=='.' ) ;
}
if(pattern[1]=='*'){
if( pattern[0]==str[0] || pattern[0]=='.' ){
bool res = match(str+1,pattern) || match(str,pattern+2 );
int k = 1;
while( k<=strlen(str) && str[k-1]==str[k] ){
res = res|| match(str+k,pattern+2 );
if(res)
return true;
k++;
}
return res;
}
else
return match(str,pattern+2 );
}
else{
return (pattern[0]==str[0] || pattern[0]=='.' )&& match(str+1,pattern+1);
}
}
{
if( strlen(str)<=0 && strlen(pattern)<=0)
return true;
if( strlen(str)<=0){
if(strlen(pattern)<=1)
return false;
else{
if(pattern[1]=='*')
return match(str,pattern+2 );
else
return false;
}
}
if( strlen(pattern)==1 ){
return ( strlen(str)==1 ) && (pattern[0]==str[0]|| pattern[0]=='.' ) ;
}
if(pattern[1]=='*'){
if( pattern[0]==str[0] || pattern[0]=='.' ){
bool res = match(str+1,pattern) || match(str,pattern+2 );
int k = 1;
while( k<=strlen(str) && str[k-1]==str[k] ){
res = res|| match(str+k,pattern+2 );
if(res)
return true;
k++;
}
return res;
}
else
return match(str,pattern+2 );
}
else{
return (pattern[0]==str[0] || pattern[0]=='.' )&& match(str+1,pattern+1);
}
}