DP:
class Solution {
public:
bool isMatch(const char *s, const char *p) {
int slen = strlen(s), plen = strlen(p), i, j;
bool dp[500][500];
memset(dp,false, sizeof(dp));
dp[0][0] = true;
for (i = 1; i <= plen; ++i) {
if (p[i] == '*') {
dp[i][0] = dp[i + 1][0] = dp[i - 1][0];
for (j = 1; j <= slen; ++j)
dp[i][j] = dp[i + 1][j] = (dp[i][j - 1] && (p[i - 1] == s[j - 1] || p[i - 1] == '.') || dp[i - 1][j]);
++i;
}
else
for (j = 1; j <= slen; ++j)
dp[i][j] = dp[i - 1][j - 1] && (p[i - 1] == s[j - 1] || p[i - 1] == '.');
}
return dp[plen][slen];
}
};
recursive:
class Solution {
public:
bool isMatch(const char *s, const char *p) {
if (*p == '\0')
return *s == '\0';
if (*(p + 1) == '*') {
for (const char *str = s; (*str == *p || *p == '.' && *str); ++str)
if(isMatch(str + 1, p + 2))
return true;
return isMatch(s, p + 2);
}
else
return (*p == *s || *p == '.' && *s) && isMatch(s + 1, p + 1);
}
};