题目描述
* 匹配1个或多个
?匹配一个
abc a*b false
abc a?c true
abc a* true
ab a** false
解法
重点就是处理掉*,如果匹配的时候 * 后面没有字符了那返回真,如果有的话,那么很简单,
从str中从后往前拿pattern 中 从*开始到pattern末尾个字符个数的字符,继续递归匹配就搞定了。
如 a*b abc
拿(b,c) 递归
如 a*bb abc 这里直接return false , 因为 bb 的个数大于 src 中剩余的个数。
如a*b abbbbc 这里拿 (b,c)递归
如a*c abc 拿 (c,c)递归即可
代码
int match(const char *str, const char *pattern)
{
//TODO:
const char * temp = NULL;
const char * end = str;
int length = 0;
while (*(end + 1) != 0)
{
++end; // 先找到 str中最后一个字符的位置
}
while (*str || *pattern)
{
while (*str == *pattern)
{
if (*str != *pattern)
break;
if (*str == 0)
return 1;
str++, pattern++;
}
if (*pattern == '?')
continue;
if (*pattern!='*')
return 0;
if (*str==0)
return 0; // 到这里只要是*str ==0 必定false ,因为无论 ab a** 还是 ab abc都false
temp = ++pattern;
if (*temp == 0)
return 1;
while (*temp)
{
++length;
temp++;
}
while (--length && end != str)
{
--end;
}
if (end == str)
return 0;
return match(end, pattern);
}
if (*str == *pattern)
return 1;
else
return 0;
}