本题是模拟题,问题出在匹配串的*上,给出的串分别与匹配串左右两边比较是否符合题意即可。注意特判去掉*之后的长度是否相同
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
char s1[N],s2[N],s3[N];
int g[30];
int main()
{
int n,len1,len2;
scanf("%s%s",s1,s2);
len1 = strlen(s1);
len2 = strlen(s2);
for(int i = 0; i < strlen(s1); i++)
{
int id = s1[i] - 'a';
g[id] = 1;
}
int res = 0,pos;
for(int i = 0; i <strlen(s2); i++)
{
if(s2[i] == '*')
{
res = 1;
pos = i;
break;
}
}
scanf("%d",&n);
if(res)
{
while(n--)
{
int fff = 0;
scanf("%s",s3);
int len = strlen(s3);
if(len < len2 - 1)//特判长度
fff = 1;
for(int i = 0; i < pos; i++)//从左向右判断
{
if(s2[i] == '?')
{
if(!g[s3[i] - 'a'])
{
fff = 1;
break;
}
}
else
{
if(s2[i] != s3[i])
{
fff = 1;
break;
}
}
}
for(int i = len - 1,j = len2 - 1; i > len - len2 + pos && j > pos; i--,j--)//从右向左判断
{
if(s2[j] == '?')
{
if(!g[s3[i] - 'a'])
{
fff = 1;
break;
}
}
else
{
if(s2[j] != s3[i])
{
fff = 1;
break;
}
}
}
for(int i = pos; i <= len - len2 + pos; i++)//判断*对应的部分
{
if(g[s3[i] - 'a'])
{
fff = 1;
break;
}
}
if(fff)printf("NO\n");
else printf("YES\n");
}
}
else
{
while(n--)
{
int fff = 0;
scanf("%s",s3);
int len = strlen(s3);
if(len != len2)
fff = 1;
else
{
for(int i = 0; i < len; i++)
{
if(s2[i] == '?')
{
if(!g[s3[i] - 'a'])
fff = 1;
}
else
{
if(s2[i] != s3[i])
fff = 1;
}
}
}
if(fff)printf("NO\n");
else printf("YES\n");
}
}
return 0;
}