zoj 2840 File Searching
题目地址: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; } } }