4. 前缀树

前缀树 (prefix tree trie)

  1. 单个字符串中,字符从前到后的加到一棵多叉树上
  2. 字符放在路上,节点上有专属的数据项(常见的是pass和end值)
  3. 所有样本都这样添加,如果没有路就新建,如有路就复用
  4. 沿途节点的pass值增加1,每个字符串结束时来到的节点end值增加1
class Trie {
        TrieNode root;

        public Trie() {
            root = new TrieNode();
        }

        // 插入字符串
        public void insert(String str) {
            if (str == null) {
                return;
            }
            TrieNode curr = root;
            root.pass++;
            int path;
            char[] arr = str.toCharArray();
            for (char c : arr) {
                path = c - 'a';
                if (curr.nexts[path] == null) {
                    curr.nexts[path] = new TrieNode();
                }
                curr.nexts[path].pass++;
                curr = curr.nexts[path];
            }
            curr.end++;
        }

        // 搜索字符串
        public int search(String str) {
            if (str == null) {
                return -1;
            }
            char[] arr = str.toCharArray();
            int path;
            TrieNode curr = root;
            for (char c : arr) {
                path = c - 'a';
                if (curr.nexts[path] == null) {
                    return -1;
                }
                curr = curr.nexts[path];
            }
            return curr.end;
        }

        public void delete(String str) {
            // 删除节点
            if (search(str) == -1) {
                return;
            }
            char[] arr = str.toCharArray();
            int path;
            TrieNode curr = root;
            for (char c : arr) {
                path = c - 'a';
                if (--curr.nexts[path].pass == 0) {
                    curr.nexts[path] = null;
                    return;
                }
                curr = curr.nexts[path];
            }
            curr.end--;
        }
        public int startsWith(String str) {
            if (str == null) {
                return -1;
            }
            char[] arr = str.toCharArray();
            int path;
            TrieNode curr = root;
            for (char c : arr) {
                path = c - 'a';
                if (curr.nexts[path] == null) {
                    return -1;
                }
                curr = curr.nexts[path];
            }
            return curr.pass;
        }
    }

    class TrieNode {
        TrieNode[] nexts;
        int pass;
        int end;

        public TrieNode() {
            nexts = new TrieNode[26];
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值