每日一题前缀树
Posted 唐宋xy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题前缀树相关的知识,希望对你有一定的参考价值。
题目
请实现一个数据结构,在给定若干个字符串时,可以计算以随机给定的字符结尾的字符串的个数有多少个,该数据结构要求有插入字符串和删除字符串的方法
时间复杂度O(longN)
分析
题目要求可以统计随机的字符为结尾的字符串个数,并且时间复杂度为O(logN),那么前缀树(字典树)是可以完全符合要求的数据结构
它的优点是:最大限度地减少无谓的字符串比较,不过前缀树的缺点是空间复杂度比较高
代码实现
这里介绍第一种前缀树的实现方式–使用数组实现,优点是占用内存比较少,操作简单。缺点是只能计算26个字母(或者固定长度的字母)
public class TrieTree
public static class Node
private int pass; // 经过该节点的字符串数
private int end; // 以该节点结尾的字符串数
private Node[] nexts; // 下面的所有子树的节点
public Node()
this.pass = 0;
this.end = 0;
nexts = new Node[26]; // 这里只能使用到小写的字母
public static class Trie
private Node root;
public Trie()
this.root = new Node();
public void insert(String word)
if(word == null)
return;
char[] chars = word.toCharArray();
Node node = root;
node.pass++;
int path = 0;
for (int i = 0; i < chars.length; i++)
path = chars[i] - 'a';
if(node.nexts[path] == null)
node.nexts[path] = new Node();
node = node.nexts[path];
node.pass++;
node.end++;
public void delete(String word)
if(word == null)
return;
char[] str = word.toCharArray();
Node node = root;
node.pass--;
int path = 0;
for (int i = 0; i < str.length; i++)
path = str[i] - 'a';
if(--node.nexts[path].pass == 0)
node.nexts[path] = null;
return;
node = node.nexts[path];
node.end--;
以上是关于每日一题前缀树的主要内容,如果未能解决你的问题,请参考以下文章