leetcode多次搜索

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;
    }
};




















发布了191 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38196982/article/details/104872878