'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符?
和*
。
dp[i][j]表示p串中i-1位置的字符可以匹配到s串中j-1位置的字符。last记录上一次匹配到的位置。
bool isMatch(char * s, char * p){
bool dp[2005][2005];
int inf = 0x3f3f3f3f;
memset(dp,0,sizeof dp);
dp[0][0]=1;
int last=0;
for(int i=1;p[i-1];i++)
{
if(p[i-1]=='*')
{
dp[i][last]=1;
for(int j=last+1;s[j-1];j++) dp[i][j]=1;
}
else
{
int minn=0x3f3f3f3f;
for(int j=last+1;s[j-1];j++)
{
if(dp[i-1][j-1] && (s[j-1]==p[i-1] || p[i-1]=='?')) dp[i][j]=1,minn=fmin(minn,j);
}
last=minn;
if(last==0x3f3f3f3f) break;
}
}
if(dp[strlen(p)][strlen(s)]) return true;
return false;
}