给定一个字符串 (s
) 和一个字符模式 (p
) ,实现一个支持 '?'
和 '*'
的通配符匹配。
'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符?
和*
。
示例 1:
输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入: s = "aa" p = "*" 输出: true 解释: '*' 可以匹配任意字符串。
示例 3:
输入: s = "cb" p = "?a" 输出: false 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
示例 4:
输入: s = "adceb" p = "*a*b" 输出: true 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".
示例 5:
输入: s = "acdcb" p = "a*c?b" 输入: false
分析:
设待匹配字符串的匹配位置为m,模式字符串的匹配位置为n
若p[n]为* 若sp[m][n]为真,有两种情况:
情况一:p中n位置以前的模式字符能匹配s中m位置以前的所有字符 即sp[m-1][n-1]为真
情况二:p[n]已经匹配了m-1位置上的字符,即sp[m-1][n]为真
若p[n]不为*当且仅当sp[m-1][n-1]位置全匹配,且p[n]=?或p[n]=s[m]时sp[m][n]为真
bool isMatch(char * s, char * p){
//需完全匹配
int len1=strlen(s);
int len2=strlen(p);
bool **sp=(bool **)malloc(sizeof(bool *)*2);
for(int i=0;i<2;++i)
{
sp[i]=(bool *)malloc(sizeof(bool)*(len2+1));
for(int j=0;j<=len2;++j)
{
sp[i][j]=false;
}
}
sp[0][0]=1;
int cur=0,pre=0;
for(int i=0;i<=len1;++i)
{
cur=i%2;
pre=(i+1)%2;
if(i>0)
{
for(int j=0;j<=len2;++j)
{
sp[cur][j]=false;
}
}
for(int j=1;j<=len2;++j)
{
if(p[j-1]=='*')
{
sp[cur][j]=sp[cur][j-1]||sp[pre][j];
}
else
{//前面匹配完成
sp[cur][j]=(i>0)&&sp[pre][j-1]&&(p[j-1]=='?'||p[j-1]==s[i-1]);
}
}
}
bool ret=sp[cur][len2];
for(int i=0;i<2;++i)
{
free(sp[i]);
}
free(sp);
return ret;
}
执行用时 : 44 ms, 在Wildcard Matching的C提交中击败了60.00% 的用户
内存消耗 : 7.3 MB, 在Wildcard Matching的C提交中击败了92.86% 的用户