题解 | #字符串匹配#
字符串匹配
https://www.nowcoder.com/practice/fbdc522ef958455687654b38a4ca01e0
#include<stdio.h> #include<string> #include<iostream> #include<vector> using namespace std; bool find(vector<char>v,char ch){ for(int i=0;i<v.size();i++){ if(v[i]==ch) return true; } return false; } bool compare(string a,string b){ if(a==b) return true; else return false; } int main(){ int n; cin>>n; getchar(); //一个是记录转化为小写的 一个是原来的这是因为要输出原来的样子又因为没有改变顺序所以可以直接按原下标访问 vector<string>v; vector<string>v2; while(n--) { string s; getline(cin,s); v2.push_back(s); for(int i=0;i<s.size();i++){ if(isalpha(s[i])) s[i]=tolower(s[i]); } v.push_back(s); } string str; getline(cin,str); for(int i=0;i<str.size();i++){ if(isalpha(str[i])) str[i]=tolower(str[i]); } vector<char>vs; int flag=0; int start=0,end=0; for(int i=0;i<str.size();i++){ if(flag&&str[i]!=']') vs.push_back(str[i]); if(str[i]=='[') {flag=1;start = i;} else if(str[i]==']') {end=i;flag=0;} } //双指针 //相等时同时++ //不相等时 1)且str不为[说明不匹配直接返回 //2)str为 [ 就一直++并且找到是否有匹配的直到为 ] 有匹配则令flag=1 //当flag!=1说明没有匹配,要结束while否则说明有匹配需要i++继续比较下一个 //while循环结束时,当i j均指向末尾时说明匹配成功,输出否则不输出 for(int x=0;x<v.size();x++){ int i=0,j=0; string t=v[x]; int flag=0; while(i<t.size()&&j<str.size()){ if(t[i]==str[j]) {i++;j++;} else if(t[i]!=str[j]&&str[j]!='[') break; else if(t[i]!=str[j]&&str[j]=='['){ j++; while(str[j]!=']'){ if(t[i]==str[j]) flag=1; j++; } j++; if(flag!=1) break; else i++; } } if(i==t.size()&&j==str.size()) cout<<x+1<<' '<<v2[x]<<endl; } }