题目链接:https://leetcode-cn.com/problems/multi-search-lcci/
题目如下:
class Solution {
public:
vector<vector<int>> multiSearch(string big, vector<string>& smalls) {
int n=smalls.size();
vector<vector<int>> res(n,vector<int>{});
for(int i=0;i<n;i++){
if(smalls[i].size()==0) continue;
insert(smalls[i],i);
}
int m=big.size();
for(int i=0;i<m;i++){
string word=big.substr(i,m-i);//注意点,substr函数的第一个参数为起始位置,第二个为复制的字符数目
search(word,res,i);
}
return res;
}
void insert(string word,int k){
auto p=root;
for(auto e:word){
if(!p->son[e-'a']){
p->son[e-'a']=new Node();
}
p=p->son[e-'a'];
}
p->small_id=k;//每次insert完成之后,就在最后一个节点的位置上,告诉这个模式串的id
}
void search(string word,vector<vector<int>>& res,int k){//最后一个参数为字符串的起始位置
auto p=root;
for(auto e:word){
if(p->small_id!=-1) res[p->small_id].push_back(k);//p->small_id!=-1,说明这一段内包含其他small模式串,也要加入ans
if(!p->son[e-'a']) return;//word还没走完,字典树已经走完
p=p->son[e-'a'];
}
if(p->small_id!=-1) res[p->small_id].push_back(k);
}
private:
struct Node{
Node* son[26];
int small_id;//每个smal模式串的id
Node(){
for(int i=0;i<26;i++){
son[i]=nullptr;
}
small_id=-1;
}
};
Node* root=new Node();
};