'。' 匹配任何单个字符。'*' 匹配零个或多个前面的元素。匹配应覆盖整个输入字符串(不是部分)。
一些例子:
isMatch(“aa”,”a”) → 假
isMatch(“aa”,”aa”) → 真
isMatch(“aaa”,”aa”) → 假
isMatch(“aa”, “a*”) → 真
isMatch(“aa”, “.*”) → 真
isMatch(“ab”, “.*”) → 真
isMatch(“aab”, “c*a*b”) → 真
作者给出了下面的解决方案,真的很漂亮。
bool isMatch(const char *s, const char *p) {
assert(s && p);
if (*p == '\0') return *s == '\0';
// next char is not '*': must match current character
if (*(p+1) != '*') {
assert(*p != '*');
return ((*p == *s) || (*p == '.' && *s != '\0')) && isMatch(s+1, p+1);
}
// next char is '*'
while ((*p == *s) || (*p == '.' && *s != '\0')) {
if (isMatch(s, p+2)) return true;
s++;
}
return isMatch(s, p+2);
}
作者还给出了一些进一步的想法:
如果您仔细考虑,您可以利用上述代码以指数复杂度运行的某些情况。
你能想出一些例子吗?你如何让上面的代码更有效率?
我想出了一个需要很长时间才能得到结果的案例,而字符串 s 和 p 的长度并不大。
s[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" p[] ="a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a* a*a*a*a*a*a*b"
谁能帮我验证这个答案?如何看待这种寻找极端的测试题?