//这道题遇到的各种挫折花了我两天足以让我写下上千字的反思,现在终于全部通过了,简单说一下经验 /* 当输出为空、输出和预期相差十万八千里时的办法: 1、查看题目的输入,接收输入的时候是否有细节没考虑到: 有的的字符串内部可能有空,要用getline(cin,str) 2、用例不支持查看 可以打印通过输出的方法,查看不通过用例的完整输入 3、没有测试用例 考虑一些极端情况,示例里没考虑到的情况,设计用例 其他经验: 类似本题,当想重新定义一个字符串(数组)存全部小写的字符串时: 要先给strr=str;先给strr整体赋值,并且长度相等。********************* 然后调整内部的字母大小写********************** str.find(']');此函数只返回第一个]出现的位置 */ #include <iostream> #include <string> using namespace std; string str[1001]; string text; string strr[1001];//转为小写后的模式串数组 string textt;//转为小写后的文本串 int main() { int num; while(cin>>num) { //string kong;//第一行num后面有个换行符没接受 // getline(cin,kong); for(int i=1;i<=num;i++) { cin>>str[i]; //getline(cin,str[i]); strr[i]=str[i];//!!!!!!! int len=str[i].size(); for(int j=0;j<len;j++) { if(str[i][j]>='A'&&str[i][j]<='Z')strr[i][j]=str[i][j]+32; else { strr[i][j]=str[i][j]; } } // cout<<"str"<<i<<str[i]<<" strr"<<i<<strr[i]<<endl;//// } cin>>text; //getline(cin,text); int n=text.size(); textt=text;//一定要加!!!********************** for(int j=0;j<n;j++) { if(text[j]>='A'&&text[j]<='Z') { textt[j]=text[j]+32; } else{ textt[j]=text[j]; } } ///// cout<<"text:"<<text<<" textt:"<<textt<<endl;//// for(int i=1;i<=num;i++)//对每个模式串检验 { //文本串没有[],模式串匹配 int find=text.find("["); if(find==string::npos&&strr[i]==textt) { cout<<i<<" "<<str[i]<<endl; break; } //文本串有多个[] int m=str[i].size(); int n=textt.size(); int k=0;//当前模式串的下标 int flag=1;//当前模式串匹配 int j;//文本串的下标 for( j=0;j<n;j++)//文本串的下标 { if(textt[j]!='[')//没进入[] { if(strr[i][k]==textt[j]) { k++; flag=1; } else { flag=0;//模式串不匹配 break; } } else//文本串[]内的匹配 { j++; while(textt[j]!=']') { if(strr[i][k]!=textt[j]) { j++; flag=0; } else {//匹配上了 k++; int tmplen=n-j; string tmp=textt.substr(j,tmplen); j=tmp.find(']')+j;//这句话一定要有,否则每次找的都是第一个]的下标 // j=textt.find(']'); // cout<<"] at "<<j<<endl; flag=1;///////!!!!!!!!这个一定要加 break; } } if(flag==0&&textt[j]==']')//括号里都不匹配,那就对下一个模式串进行检验 { // cout<<"括号里都不匹配"<<" ";/////////////// break;//检验下一个模式串去 } } }//和文本串一一校对 if(flag==1&&j==n&&k==m)//条件别漏了 { cout<<i<<" "<<str[i]<<endl;//每个都输出 } // else cout<<i<<" f0 "<<str[i]<<endl; }//检验下一个模式串 } }