每日一题前缀树

Posted 唐宋xy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题前缀树相关的知识,希望对你有一定的参考价值。

题目

请实现一个数据结构,在给定若干个字符串时,可以计算以随机给定的字符结尾的字符串的个数有多少个,该数据结构要求有插入字符串和删除字符串的方法

时间复杂度O(longN)

分析

题目要求可以统计随机的字符为结尾的字符串个数,并且时间复杂度为O(logN),那么前缀树(字典树)是可以完全符合要求的数据结构

它的优点是:最大限度地减少无谓的字符串比较,不过前缀树的缺点是空间复杂度比较高

代码实现

这里介绍第一种前缀树的实现方式–使用数组实现,优点是占用内存比较少,操作简单。缺点是只能计算26个字母(或者固定长度的字母)

public class TrieTree 

    public static class Node 
        private int pass; // 经过该节点的字符串数
        private int end; // 以该节点结尾的字符串数
        private Node[] nexts; // 下面的所有子树的节点


        public Node() 
            this.pass = 0;
            this.end = 0;
            nexts = new Node[26]; // 这里只能使用到小写的字母
        
    

    public static class Trie 
        private Node root;

        public Trie() 
            this.root = new Node();
        

        public void insert(String word) 
            if(word == null) 
                return;
            
            char[] chars = word.toCharArray();
            Node node = root;
            node.pass++;
            int path = 0;
            for (int i = 0; i < chars.length; i++) 
                path = chars[i] - 'a';
                if(node.nexts[path] == null) 
                    node.nexts[path] = new Node();
                
                node = node.nexts[path];
                node.pass++;
            
            node.end++;
        

        public void delete(String word) 
            if(word == null) 
                return;
            
            char[] str = word.toCharArray();
            Node node = root;
            node.pass--;
            int path = 0;
            for (int i = 0; i < str.length; i++) 
                path = str[i] - 'a';
                if(--node.nexts[path].pass == 0) 
                    node.nexts[path] = null;
                    return;
                
                node = node.nexts[path];
            
            node.end--;
        

    



以上是关于每日一题前缀树的主要内容,如果未能解决你的问题,请参考以下文章

每日一题前缀树

每日一题654. 最大二叉树

每日一题814. 二叉树剪枝

每日一题前缀树-Map实现

每日一题前缀树-Map实现

每日一题前缀树-Map实现