题解 | #字符串匹配#
字符串匹配
https://www.nowcoder.com/practice/fbdc522ef958455687654b38a4ca01e0
#include<bits/stdc++.h> using namespace std; void toLower(string &s) { for (int i = 0; i < s.size(); i++) { s[i] = tolower(s[i]); } return; } bool match(string s, string m) { toLower(s); toLower(m); int front = 0, back = 0; int ps = -1, pm = -1; int len = s.size(); while (ps < len) { front = m.find('[', pm+1); back = m.find(']', pm+2); string s1, s2; if (front != string::npos) { s1 = m.substr(pm+1, front - pm -1); s2 = s.substr(ps+1, s1.size()); if (s1 != s2) { break; } ps += s1.size(); pm += s1.size(); s1 = m.substr(front + 1, back - front - 1); if (s1.find(s[ps+1]) == string::npos) { break; } ps++; pm = back; } else { s1 = m.substr(pm+1); s2 = s.substr(ps+1, s1.size()); if (s1 != s2) { break; } ps = s.size(); } } if (ps < len) { return false; } else { return true; } } int main() { int n; string input, m; vector<string> words; while (cin >> n) { for (int i = 0; i < n; i++) { cin >> input; words.push_back(input); } cin >> m; for (int i = 0; i < n; i++) { if (match(words[i], m)) { printf("%d %s\n", i + 1, words[i].c_str()); } } } }