-
题目描述:
-
读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。
-
输入:
-
输入有多组数据。
每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。
-
输出:
-
输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。
-
样例输入:
-
4 Aab a2B ab ABB a[a2b]b
-
样例输出:
-
1 Aab 2 a2B 4 ABB
-
利用string的字符串查找函数find和string::npos到字符串末尾,将字符统一成大写
#include<cstdio>
#include<iostream>
using namespace std;
string a[1004],A[1004];
string tmp;
int main() {
int n;
while(~scanf("%d",&n)) {
for(int i=0; i<n; i++) {
cin>>A[i];
a[i]=A[i];
for(int j=0; j<a[i].size(); j++) {
a[i][j]=toupper(a[i][j]);//统一转换成大写字母
}
}
cin>>tmp;
for(int i=0; i<tmp.size(); i++) {
tmp[i]=toupper(tmp[i]);
}
int p1=tmp.find('[');
if(p1==string::npos) {//如果待匹配的字符串中没有[]
for(int i=0;i<n;i++){
if(a[i]==tmp){
cout<<i+1<<" "<<A[i]<<endl;
}
}
} else {
int p2=tmp.find(']');
string pre,mid,post;//有的话分成三部分
pre=tmp.substr(0,p1);
mid=tmp.substr(p1+1,p2-p1-1);
post=tmp.substr(p2+1);
for(int i=0; i<n; i++) {
if(pre==a[i].substr(0,p1)&&mid.find(a[i][p1])!=string::npos&&post==a[i].substr(p1+1)) {
cout<<i+1<<" "<<A[i]<<endl;
}
}
}
}
return 0;
}