題目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2612
題解: 1 只用找到星號的位置,然後比較兩端
2使用algorithm中的反轉比較方便,不用管第二段開始的位置
3 容易忽略的地方,至少b要和a去掉星號後一樣長啊,否則 a*a 和a這種情況也匹配了
4要求多多的輸入輸出,不說了
代碼:
#include<iostream>#include<string>#include<cstring>#include<algorithm>using namespace std;int match(string a,string b) // a is original b contains *{ if(a.length()<b.length()-1) return 0; int spark=0; int sizeb=b.length(); for(int i=0;i<sizeb;i++) if(b[i]=='*') { spark=i; break; } string b1=b.substr(0,spark); string a1=a.substr(0,spark); reverse(a.begin(),a.end()); // include的是algorithm reverse(b.begin(),b.end()); string a2=a.substr(0,b.length()-1-spark); string b2=b.substr(0,b.length()-1-spark); if(a1==b1&&a2==b2) return 1; else return 0;}int main(){ int n; bool isfirst=true; while(cin>>n) { if(isfirst==false) cout<<endl; if(isfirst==true) isfirst=false; string * p=new string [n]; for(int i=0;i<n;i++) cin>>p[i]; int m; cin>>m; string key; for(int i=0;i<m;i++) { cin>>key; int exist=0; for(int j=0;j<n;j++) if(match(p[j],key)) { if(exist==1)cout<<", "; cout<<p[j]; exist=1; } if(exist==0) cout<<"FILE NOT FOUND"; cout<<endl; } }}