码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构与算法之前缀树

时间:2020-05-26 12:35:28      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:查找   trie   node   算法   this   next   let   出现   stat   

public class TrieTree {

    public Node root;

    public TrieTree(){
        root = new Node(‘ ‘);
    }

    /** 插入字符串 */
    public void insert(String str){

        if(str == null){
            return;
        }

        Node node = this.root;

        /** 每次进来都要加一 */
        node.pass ++;

        char [] chs = str.toCharArray();
        int path;
        for (int i = 0; i < chs.length; i++) {
            path = chs[i] - ‘a‘;

            /** 如果没有到达path的节点 那么就新建 */
            if(node.nexts[path] == null){
                node.nexts[path] = new Node(chs[i]);
            }

            node = node.nexts[path];

            node.pass ++;

        }

        /** 最后一个节点收尾 要加一 */
        node.end ++;

    }

    /** 查找字符串的出现次数 */
    public int search(String str){
        if(str == null){
            return 0;
        }

        int path;
        char[] chs = str.toCharArray();

        Node node = this.root;

        for (int i = 0; i < chs.length; i++) {

            path = chs[i] - ‘a‘;
            if(node.nexts[path] == null){
                return 0;
            }

            node = node.nexts[path];
        }

        return node.end;
    }

    /** 删除字符串 */
    public void delete(String str){

        if(str == null){
            return;
        }

        /** 删除之前 需要判断是否加入过 */
        if(search(str) == 0){
            return;
        }

        int path;
        Node node = this.root;

        node.pass --;
        char [] chs = str.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            path = chs[i] - ‘a‘;

            /** 要考虑一件事 有可能这次delete后 会有无效的节点残留 */
            /** 如果 next接单的pass值-1后为0了 那么就舍弃掉next之后的(包括next)所有节点 */
            if(--node.nexts[path].pass == 0){
                node.nexts[path] = null;
                return;
            }

            node = node.nexts[path];
        }

        node.end --;
    }


    public static class Node{

        public Node [] nexts;
        public int pass;
        public int end;
        public char c;

        public Node(char c){
            this.nexts = new Node[26];
            this.pass = 0;
            this.end = 0;
            this.c = c;
        }
    }
}

 

数据结构与算法之前缀树

标签:查找   trie   node   算法   this   next   let   出现   stat   

原文地址:https://www.cnblogs.com/self-crossing/p/12964552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!