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;
    }
}
复制代码
posted @   Jathon-cnblogs  阅读(304)  评论(0)    收藏  举报
编辑推荐:
· 记一次 .NET 某发证机系统 崩溃分析
· 微服务架构学习与思考:SOA架构与微服务架构对比分析
· tomcat为什么假死了
· 聊一聊 Linux 上对函数进行 hook 的两种方式
· C# 锁机制全景与高效实践:从 Monitor 到 .NET 9 全新 Lock
阅读排行:
· 一周 Star 破万的开源项目「GitHub 热点速览」
· 上周热点回顾(6.9-6.15)
· 记一次 .NET 某SaaS版CRM系统 崩溃分析
· 不写代码,让 AI 生成手机 APP!保姆级教程
· Spring用到的10种设计模式,真巧妙!
点击右上角即可分享
微信分享提示