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; } }
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET 某发证机系统 崩溃分析
· 微服务架构学习与思考:SOA架构与微服务架构对比分析
· tomcat为什么假死了
· 聊一聊 Linux 上对函数进行 hook 的两种方式
· C# 锁机制全景与高效实践:从 Monitor 到 .NET 9 全新 Lock
· 一周 Star 破万的开源项目「GitHub 热点速览」
· 上周热点回顾(6.9-6.15)
· 记一次 .NET 某SaaS版CRM系统 崩溃分析
· 不写代码,让 AI 生成手机 APP!保姆级教程
· Spring用到的10种设计模式,真巧妙!