题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/b580add143ba4674bcf7a89c49ead9a1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc3o2NmNt,size_20,color_FFFFFF,t_70,g_se,x_16)
C代码
bool isRuleMatch(char *s, char *p)
{
if (*p == '.' && *s != '\0')
return true;
if (*s == *p)
return true;
return false;
}
bool bt(const char *s, const char *p, int slen, int plen) {
int i,j;
bool ret = false;
int xlen = 0;
if(slen == 0) {
if (plen == 0) {
return true;
}
if (plen > 1 && *(p+1) == '*') {
ret = bt(s, p+2, slen, plen-2);
} else {
ret = false;
}
return ret;
}
if(plen == 1) {
if(slen != 1) {
return false;
}
return isRuleMatch(s, p);
}
if (plen > 1) {
if(*(p+1) == '*') {
for(i = 0; i <= slen; i++) {
ret |= bt(s+i, p+2, slen-i, plen-2);
if (!isRuleMatch(s+i,p)) {
break;
}
}
} else {
if(!isRuleMatch(s,p)) {
return false;
}
ret |= bt(s+1, p+1, slen-1,plen-1);
}
}
return ret;
}
bool isMatch(char * s, char * p){
return bt(s, p, strlen(s), strlen(p));
}
注意点
- 单字符匹配的场景(即匹配规则中不带*),先匹配后递归,栈的使用率会更好;
- 处理s的长度为0,与p的长度不为0的情景;
- 注意递归[a-z][*]的场景需要将所有的字符串送入,包含’\0’;
- [.]不能匹配空字符;