1.字典树
对small建trie树,其中每个树节点的isWord记录对于的其在smalls中的数组下标
对字符串big,遍历其所有后缀,对于从i--big.size()-1的后缀,设为prefix,在trie树中进行查询,遍历prefix,当出现一个字符的isWord!=-1时,表示从prefix[0]--prefix[j]是一个与smalls中匹配的字符串,则记录
代码如下:
class TrieNode{
public:
int isWord;//表示是原small中第几个字符串
TrieNode *child[26];
TrieNode()
{
isWord=-1;
memset(child,0,sizeof(child));
}
~TrieNode()
{
for(int i=0;i<26;i++)
if(child[i])
delete child[i];
}
};
class Solution {
TrieNode *root=new TrieNode();
void insert(string word,int s)
{
TrieNode *p=root;
for(int i=0;i<word.size();i++)
{
char c=word[i];
if(p->child[c-'a']==NULL)
p->child[c-'a']=new TrieNode();
p=p->child[c-'a'];
}
p->isWord=s;
}
void search(string word,vector<vector<int>> &ans,int bid)
{
TrieNode *p=root;
for(int i=0;i<word.size();i++)
{
char c=word[i];
if(p->isWord!=-1)
ans[p->isWord].push_back(bid);//从0到word[i]是small中的一个字符串,则记录
p=p->child[c-'a'];
if(p==NULL)
return ;
}
if(p->isWord!=-1)
ans[p->isWord].push_back(bid);
}
public:
vector<vector<int>> multiSearch(string big, vector<string>& smalls) {
int m=big.size(),n=smalls.size();
vector<vector<int>> ans(n);
for(int i=0;i<n;i++)
{
if(smalls[i].size()==0)
continue;
insert(smalls[i],i);
}
for(int i=0;i<m;i++)
{
string word=big.substr(i);//将big从i开始到结尾赋值给word
search(word,ans,i);
}
return ans;
}
};