#include <cmath> #include <iostream> #include <math.h> using namespace std; /* 最笨的办法暴力求解QvQ []内单独做循环比较,[]外直接比较 */ //不区分大小写的字符比较 bool IsEqual(char x, char y){ if(x == y || fabs(x-y) == 32) return true; else return false; } //2个指针逐个遍历,no是主函数直接把行号传过来,我觉得比较方便 void Match(string text, string pattern, int no){ int n = text.size(); int m = pattern.size(); int i=0, j=0, k, flag=0, match=0; //flag指示即将进入[],match指示[]内是否匹配到字符 string res = ""; //res记录当前已匹配上的子串,方便输出 while (i<n) { k=i; //从text[k] & pattern[j]开始匹配 while (j<m && k<n) { if(pattern[j] == '['){ //准备进入[] flag = 1; ++j; continue; } if(flag){ int l = j; // 进入[],l记录pattern的起始位置,向后遍历 while (pattern[l] != ']') { if(IsEqual(text[k], pattern[l])){ //若匹配上则记录下来 res += text[k]; match = 1; } ++l; } flag = 0; //退出[]比较 if(match){ j=l; //成功匹配,比较下一字符 ++j; ++k; match=0; } else{ res=""; //匹配失败,退出本次循环,从主串下一位重新比较 break; } } else{ //[]外的比较,正常比较即可 if (IsEqual(text[k], pattern[j])) { res += text[k]; ++k; ++j; } else { res = ""; break; } } } if(j == m){ //模式串匹配成功则输出 cout<<no<<" "<<res<<endl; res = ""; } j=0; ++i; } } int main() { int n; cin>>n; string text[n], pattern; for(int i=0; i<n; ++i) cin>>text[i]; cin>>pattern; int i, j; for(i=0; i<n; ++i){ Match(text[i], pattern, i+1); } }