class Solution {
public:
bool isMatch(const char *s, const char *p) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (*s == '\0' && *p == '\0')
{
return true;
}
int npLen = 0;
for (int i = 0; i < strlen(p); ++i)
{
if (p[i] != '*')
{
++npLen;
}
}
int sLen = strlen(s);
if (npLen > sLen)
{
return false;
}
vector<vector<bool> > match(2, vector<bool>(sLen + 1, false));
int index = 1;
match[0][0] = true;
for (int i = 0; i < strlen(p); ++i)
{
int index1 = index ^ 1;
if (p[i] == '*')
{
while (p[++i] == '*');
--i;
bool flag = false;
for (int j = 0; j <= sLen; ++j)
{
if (match[index1][j] && !flag)
{
flag = true;
}
match[index][j] = flag;
}
}
else
{
match[index][0] = false;
for (int j = 1; j <= sLen; ++j)
{
match[index][j] = match[index1][j - 1] && (p[i] == s[j - 1] || p[i] == '?');
}
}
index = index1;
}
index ^= 1;
return match[index][sLen];
}
};
参考:http://blog.csdn.net/sunbaigui/article/details/8981369
还有简单点的递归写法,大数据容易超时:
class Solution {
public:
bool isMatch(const char *s, const char *p) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (*p == '*')
{
while (*(p + 1) == '*')
{
++p;
}
bool match = false;
while ((match = isMatch(s, p + 1)) == false)
{
if (*s == '\0')
{
break;
}
++s;
}
return match;
}
if (*s == '\0' || *p == '\0')
{
return *s == '\0' && *p == '\0';
}
if (*p == '?')
{
return isMatch(s + 1, p + 1);
}
return *s == *p && isMatch(s + 1, p + 1);
}
};