题意:告诉你good字母,对于字符串s1*可以变成任意的非good 字符串; ? 可以变成任意的good字母;问给你s2,问是否能从s1变成s2;
思路:判断是否有*,分成2类,然后再分类讨论。
!!!不建议阅读我的代码!!!
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+500;
bool vis[500];
int main(void)
{
memset(vis,false,sizeof(vis));
char str[30];
scanf("%s",str);
int len=strlen(str);
for(int i=0; i<len; i++)
{
vis[str[i]]=true;
}
char s[maxn];
int flag=0;
scanf("%s",s);
len=strlen(s);
for(int i=0; i<len; i++)
{
if(s[i]=='*')
{
flag=1;
break;
}
}
int n ;
cin >> n;
if(flag==0)
{
int f=0;
for(int k=1; k<=n; k++)
{
char temp[maxn];
scanf("%s",temp);
int len1=strlen(temp);
if(len!=len1)
{
printf("NO\n");
continue;
}
int f=0;
for(int i=0; i<len; i++)
{
if(s[i]=='?' && vis[temp[i]]==true)
continue;
if(s[i]!=temp[i])
{
f=1;
printf("NO\n");
break;
}
}
if(f==0) printf("YES\n");
}
}
else if(flag==1)
{
for(int k=1; k<=n; k++)
{
char temp[maxn];
scanf("%s",temp);
int len1=strlen(temp);
if(len1>len)
{
int dlen=len1-len;
int i=0,j=0;
int f=0;
while(j<len1)
{
if(s[i]=='?' && vis[temp[j]]==true) {i++,j++;continue;}
if(s[i]=='*')
{
for(;j<=i+dlen;++j)
{
if(vis[temp[j]]==true)
{
printf("NO\n");
f=1;
break;
}
}
j--;
if(f==0) {i++,j++;continue;}
}
if(f==1) break;
if(s[i]!=temp[j])
{
f=1;
printf("NO\n");
break;
}i++,j++;
}
if(f==0)
printf("YES\n");
}
else if(len1==len)
{
int f=0;
for(int i=0; i<len; i++)
{
if(s[i]=='*' && vis[temp[i]]==false) continue;
if(s[i]=='*' && vis[temp[i]]==true)
{
f=1;
printf("NO\n");
break;
}
if(s[i]=='?' && vis[temp[i]]==true)
continue;
if(s[i]!=temp[i])
{
f=1;
printf("NO\n");
break;
}
}
if(f==0) printf("YES\n");
}
else if(len1==len-1)
{
int i=0,j=0,f=0;
while(j<len1)
{
if(s[i]=='*')
i++;
if(s[i]=='?' && vis[temp[j]]==true)
{
i++,j++;
continue;
}
if(s[i]!=temp[j])
{
f=1;
printf("NO\n");
break;
}
i++,j++;
}
if(f==0) printf("YES\n");
}
else if(len1 < len-1)
printf("NO\n");
}
}
}
// 改了一个多小时的bug才改出来的。 自己的代码一手bug . 尴尬