题意:先给出一行字符串,里面的字符都是好的字符,再给出一行字符B,B里面有小写字母,?,最多一个*,?可以代替很好的字母,*可以代替空格或者任意个坏的字母,问给出的字符串是否可以由B匹配
思路:我是先判断是否有*,没有就for,有的话就分2种情况,我用*和不用*,用*就是把*前面的字符串和*后面的字符串和它匹配,剩下来的就是可以用*来代替的,如果他全是坏的,就return 1,否则 return 0;
(心态崩了,,,在寝室默默看代码发现少写了2个return 0,然后艰难的用手机改掉提交。。。WA19,早上起来的时候发现 有一个return 0,写错地方。。。嗨呀
(附上辣鸡代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; int b[30]; char s2[N]; string s1; string s; bool hh1(int x){//直接跳过 int l=0,tt=0; for(int j=0;j<strlen(s2);j++){ if(l>=s1.size()) {return 0;} if(l==x) {l++;j--;continue;} if(s2[j]!=s1[l]){ if(s1[l]=='?'){ if(b[s2[j]-'a']==0){ return 0; } } else {return 0;} } l++; } if(l==s1.size()||(l==s1.size()-1&&s1[s1.size()-1]=='*')) return 1; else return 0; } bool hh2(int x){ int l=0,r=strlen(s2)-1; for(int i=0;i<x;i++){ if(l>=strlen(s2)) return 0; if(s2[l]!=s1[i]){ if(s1[i]=='?'){ if(b[s2[l]-'a']==0) return 0; } else return 0;//第1个return 0; } l++; } for(int i=s1.size()-1;i>x;i--){ if(r<=0) return 0; if(s2[r]!=s1[i]){ if(s1[i]=='?'){ if(b[s2[r]-'a']==0) return 0; }else return 0;//第2个return 0 } r--; } if(l>r) return 0; for(int i=l;i<=r;i++) { if(b[s2[i]-'a']==1) return 0; } return 1; } int main(){ cin>>s; for(int i=0;i<s.size();i++){ b[s[i]-'a']=1; } cin>>s1;int y=-1; int len=s1.size(); for(int j=0;j<len;j++){ if(s1[j]=='*') y=j; } int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s2); if(y==-1){ int l=0,tt=0; for(int j=0;j<strlen(s2);j++){ if(l>s1.size()) {tt=1;break;} if(s2[j]!=s1[l]){ if(s1[l]=='?'){ if(b[s2[j]-'a']==0){ tt=1;break; } } else {tt=1;break;} } l++; } if(l!=s1.size()||tt==1) { printf("NO "); } else printf("YES "); } else { if(hh1(y)){ printf("YES ");continue; } if(hh2(y)){ printf("YES ");continue; } printf("NO "); } } } /* q *b 2 cb */