思路

谈起字符串匹配,想到啥,KMP 算法,但是这里用可能不太合适,所以简单地用双指针遍历就好了,一个指针指向字符串,一个指向带有中括号的字符串,但是还是建议对 KMP 不熟悉地同学去复习一下

  • 遇到中括号就观察中括号里面有没有对应的字符,没的话返回 false,有的话比较下一个字符
  • 不是中括号就直接比较
#include<iostream>
#include<vector>

using namespace std;

bool dfs(string s, string pattern, int idx, int idx2){
    if(idx == s.size() && idx2 == pattern.size()) return true;
    if(idx == s.size() || idx2 == pattern.size()) return false;
    if(pattern[idx2] == '['){
        bool flag = false;
        while(pattern[idx2 ++] != ']'){
            if(tolower(pattern[idx2]) == tolower(s[idx])){
                flag = true;
            }
        }
        if(flag) return dfs(s, pattern, idx + 1, idx2);
        else return false;
    }else{
        if(tolower(pattern[idx2]) == tolower(s[idx]))
            return dfs(s, pattern, idx + 1, idx2 + 1);
        else return false;
    }
}
int main(){
    int n;
    while(cin >> n){
        vector<string> strs(n);
        for(int i = 0; i < n; i ++){
            cin >> strs[i];
        }
        string pattern;
        cin >> pattern;
        for(int i = 0; i < n; i ++){
            if(dfs(strs[i], pattern, 0, 0)){
                cout << i + 1 << " " << strs[i] << endl;
            }
        }
    }
    return 0;
}