Regular Expression Matching

bool isMatch(char* s, char* p) {

if(s[0] == 0)
{
if(p[0] == 0)return true;
if(p[0] != 0 && p[1] == '*')return isMatch(s,p+2);
return false;
}

if(p[0] == 0)return false;

if(p[1] == '*')
{
if(p[0] == s[0]||p[0] == '.')return (isMatch(s+1,p) || isMatch(s,p+2));
else return isMatch(s,p+2);
}

if(p[0] == s[0] || p[0] =='.')
{
return isMatch(s+1,p+1);
}

return false;
}


bool isMatch(char* s, char* p) {
int s_len = strlen(s);
int p_len = strlen(p);
bool **f = (bool**)malloc(sizeof(bool*)*(s_len+1));
for (int i = 0; i <= s_len; ++i)
f[i] = (bool*)malloc(sizeof(bool)*(p_len+1));
f[0][0] = true;
for (int i = 1; i <= s_len; ++i)
f[i][0] = false;
for (int i = 1; i <= p_len; ++i)
f[0][i] = i > 1 && f[0][i-2] == true && p[i - 1] == '*';
for (int i = 1; i <= s_len; ++i)
for (int j = 1; j <= p_len; ++j)
if (p[j-1] != '*')
f[i][j] = f[i-1][j-1] == true && (s[i-1] == p[j-1] || p[j-1] == '.');
else
f[i][j] = f[i][j-2] == true || (s[i-1] == p[j-2] || p[j-2] == '.') && f[i-1][j] == true;
bool result = f[s_len][p_len];
for (int i = 0; i <= s_len; ++i)
free(f[i]);
free(f);
return result;
}