-
题目描述:
-
读入数据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
代码
#include<iostream> #include<string> #include<cstring> using namespace std; const int MAX=100; int cmp(char a,char b) { if(a==b) return 0; else { if((a<='z')&&(a>='a')&&(a-32==b)) return 0; if((a<='Z')&&(a>='A')&&(a+32==b)) return 0; return 1; } } int main() { int n,i,j,k,s1,s2,flag; char str[MAX]; char **p; while(cin>>n) { p=new char*[n]; for(i=0;i<n;i++) p[i]=new char[MAX]; for(i=0;i<n;i++) cin>>p[i]; cin>>str; s1=strlen(str); for(i=0;i<n;i++) { s2=strlen(p[i]); for(j=0,k=0;(j<s2)&&(k<s1);j++,k++) { if(cmp(p[i][j],str[k])==0) continue; else if(str[k]=='[') { flag=0; while(str[k]!=']') { if(cmp(p[i][j],str[k])==0) flag=1; k++; } if(flag!=1) break; } else break; } if((j==s2)&&(k==s1)) cout<<i+1<<" "<<p[i]<<endl; } for(i=0;i<n;i++) delete[]p[i]; delete[]p; } } /************************************************************** Problem: 1165 User: Myracle Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/