首页 > 其他分享 >前缀树

前缀树

时间:2023-09-22 11:02:26浏览次数:26  
标签:index word 前缀 int TrieNode nexts cur

前缀树_前缀树

class TrieNode{
public:
    int pass;
    int end;
    vector<TrieNode*> nexts;
    TrieNode(){
        pass = 0;
        end = 0;
        for(int i = 0; i < 26; i++)
            nexts.push_back(nullptr);
    }
};
class Trie{
public:
    TrieNode *root;
    Trie(){
        root = new TrieNode();
    }
    void insert(string word){
        TrieNode *cur = root;
        cur -> pass++;
        for(int i = 0; i < word.size(); i++){
            int index = word[i] - 'a';
            if(cur -> nexts[index] == nullptr){
                cur -> nexts[index] = new TrieNode();
            }
            cur = cur -> nexts[index];
            cur -> pass++;
        }
        cur -> end++;
    }
    int search(string word){
        TrieNode *cur = root;
        for(int i = 0; i < word.size(); i++){
            int index = word[i] - 'a';
            if(cur -> nexts[index] == nullptr){
                return 0;
            }
            cur = cur -> nexts[index];
        }
        return cur -> end;
    }
    int prefix(string pre){
        TrieNode *cur = root;
        for(int i = 0; i < pre.size(); i++){
            int index = pre[i] - 'a';
            if(cur -> nexts[index] == nullptr){
                return 0;
            }
            cur = cur -> nexts[index];
        }
        return cur -> pass;
    }
    void mydelete(TrieNode *cur){
        TrieNode *next;
        while(cur){
            for(int i = 0; i < 26; i++){
                if(cur -> nexts[i] != nullptr){
                    next = cur -> nexts[i];
                }
            }
            delete(cur);
            cur = next;
            next = nullptr;
        }
    }
    void Triedelete(string word){
        if(search(word) != 0){
            TrieNode *cur = root;
            cur -> pass--;
            for(int i = 0; i < word.size(); i++){
                int index = word[i] - 'a';
                if(--(cur ->nexts[index] -> pass) == 0){
                    mydelete(cur -> nexts[index]);
                    cur -> nexts[index] = nullptr;
                    return;
                }
                cur = cur -> nexts[index];
            }
            cur -> end--;
        }
    }
};

标签:index,word,前缀,int,TrieNode,nexts,cur
From: https://blog.51cto.com/u_15724083/7562743

相关文章

  • 基本前缀和算法:一维前缀和、二维前缀和、子矩阵和
    1、一维前缀和以AcWing.795为例,题目要求如下:输入一个长度为N的整数序列。接下来再输入m个询问,每个询问输入一对l,r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一......
  • 力扣14.最长公共前缀
    编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl" 示例2:输入:strs=["dog","racecar","car"]输出:""解释:输入不存在公共前缀。 ......
  • windows批量删除指定前缀key
    直接上代码:del_keys_by_prefix.bat@echooffecho调用格式:[redis地址][redis密码][redis库号][待删除的key前缀带*]setkeysfile=redis-cached-keys.txtredis-cli-h%1-a%2-n%3keys%4>%keysfile%FOR/F%%iin(%keysfile%)DO(redis-cli-h%1-a%2-n%3de......
  • 前缀和与差分
    1.前缀和一维数组#include<iostream>usingnamespacestd;constintN=1e5+10;intmain(){intn,m,a[N],sum[N]={0};scanf("%d%d",&n,&m);for(inti=1;i<=n;i++){scanf("%d",&a[i]);sum[i]=s......
  • UVA-1401 - Remember the Word -----Trie前缀树
    题意:给出N个不同单词和一个长字符串S。把这个字符串分解成若干个单词的连接(单词尅重复使用),问有多少种方法?分析:令d[i]表示从字符i开始的字符串的分解方案数,则d[i]=sum{d[i+len[x]]|单词x是S[i...len]的前缀};详看《算法竞赛入门经典》---刘汝佳--Page208.......
  • 前缀和 与 区间
    思想a~b区间可以转换为0~b-0~(a-1)用这种前缀和的思想,可以快速枚举所有合格条件的自区间。   classSolution:defsubarraySum(self,nums:List[int],k:int)->int:m=dict()m[0]=1cur,res=0,0fornum......
  • 前缀和数组
    classPrefixSum{//前缀和数组privateint[]prefix;/*输⼊⼀个数组,构造前缀和/publicPrefixSum(int[]nums){prefix=newint[nums.length+1];//计算nums的累加和for(inti=1;i<prefix.length;i++){prefix[i]=prefix[i-1]+nums[i-1];}}/......
  • 前缀树(Trie)的java实现
    前缀树prefixtree,又叫做trie。关键Feature如下:树形结构根节点为空结点包含Node[]nexts;//size26intisEnd;//有多少个字符串以当前字符结尾intpass;//多少个字符串经过了当前字符常用操作insertdeletesearch//字符串在前缀树中出现的次数prefi......
  • 前缀和与差分
    前缀和一维前缀和公式:\[s[i]=s[i-1]+a[i]\]模板:constintN=10000+10;intn,m;inta[N],s[N];intmain(){ scanf("%d%d",&n,&m);for(inti=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]......
  • 多阶前缀和学习笔记
    例题传送门:P4062[Code+#1]Yazid的新生舞会简要题意:给定一串序列\(A_1,A_2,...,A_n\),求有多少个子区间\([l,r]\)满足子区间内众数的个数大于\(\frac{r-l+1}{2}\)思考若数\(w\)是众数的方案数:新建一个序列\(B\),令\(B_i=[A_i=w]\),考虑前缀和\(S_i=\sum\limits_{k=1}^iB_i=S_{i-1......