class Solution {
public:
// int *dp;
bool isMatch(const char *s, const char *p) {
if(s == NULL || p == NULL)return false;
int slen = strlen(s);
int plen = strlen(p);
//尽可能的想到特殊情况,能剪枝的剪掉,模式串除掉所有*若长度大于 匹配串长度肯定失配
int cnt = 0,idx = 0;
while(p[idx])
{
if(p[idx] == '*')cnt++;
idx++;
}
if(slen < plen - cnt)return false;
bool *dp = new bool[slen + 5];
memset(dp, false, sizeof(bool) * (slen + 5));
dp[0] = true;
for(int i = 1; i <= plen; ++i)
{
if(p[i - 1] == '*')
{
int min_match_pos = slen + 1;
for(int j = 0; j <= slen; ++j)
{
if(dp[j])
{
min_match_pos = j;
break;
}
}
while(min_match_pos <= slen)dp[min_match_pos++] = true;
}
else
{
for(int j = slen; j >= 1; --j)
dp[j] = dp[j - 1] && (s[j - 1] == p[i - 1] || p[i - 1] == '?');
//当 s[0]匹配前一个,切当前i 下标 的值为 *
//注意边界情况 0不能在循环里操作
dp[0] = dp[0] && (p[i - 1] == '*');
}
}
bool rtv = dp[slen];
delete[] dp;
return rtv;
}
};