zoukankan      html  css  js  c++  java
  • Trie树的插入,查前缀,查单词,删前缀和删单词。

    这个Trie原先用C++就敲得很熟了,看了蓝桥杯的视频后学会把一个功能这样封装起来,以后用的时候就很爽可以直接调用了,所以就用Java写了;

    public class Trie {
        private final int SIZE = 26;
        private final int HEAD = 'a';
        private int cnt;
        private int tail;
        private Trie[] next = new Trie[SIZE];
        void insert(String s) {
            Trie now = this;
            for (int i = 0; i < s.length(); i++) {
                int id = s.charAt(i) - HEAD;
                if (now.next[id] == null) {
                    now.next[id] = new Trie();
                }
                now = now.next[id];
                now.cnt++;
            }
            now.tail++;
        }
        int queryPrefix(String s) {
            Trie now = this;
            for (int i = 0; i < s.length(); i++) {
                int id = s.charAt(i) - HEAD;
                if (now.next[id] == null) {
                    return 0;
                }
                now = now.next[id];
            }
            return now.cnt;
        }
        int queryWord(String s) {
            Trie now = this;
            for (int i = 0; i < s.length(); i++) {
                int id = s.charAt(i) - HEAD;
                if (now.next[id] == null) {
                    return 0;
                }
                now = now.next[id];
            }
            return now.tail;
        }
        void deletePrefix(String s) {
            int sum = queryPrefix(s);
            if (sum == 0) {
                return;
            }
            Trie now = this;
            for (int i = 0; i < s.length(); i++) {
                int id = s.charAt(i) - HEAD;
                now.next[id].cnt -= sum;
                if (now.next[id].cnt == 0) {
                    now.next[id] = null;
                    return;
                }
            }
        }
        void deleteWord(String s) {
            int sum = queryWord(s);
            if (sum == 0) {
                return;
            }
            Trie now = this;
            for (int i = 0; i < s.length(); i++) {
                int id = s.charAt(i) - HEAD;
                now.next[id].cnt -= sum;
                if (now.next[id].cnt == 0) {
                    now.next[id] = null;
                    return;
                }
            }
            now.tail -= sum;
        }
    }
  • 相关阅读:
    反转链表 --剑指offer
    链表的倒数第K个节点
    打印1到最大的n位数----java实现
    Permutations java实现
    Generate Parentheses java实现
    Binary Tree Level Order Traversal java实现
    hadoop中日志聚集问题
    PIG的配置
    hadoop2.20.0集群安装教程
    Map/Reduce之间的Partitioner接口
  • 原文地址:https://www.cnblogs.com/Angel-Demon/p/10243668.html
Copyright © 2011-2022 走看看