前缀树
使用一个树结构记录一组数据,数据可以是字符串数组。
public class TrieTree {
public static class TrieNode{
public int pass;//经过该节点的字符的数量
public int end;//以该节点为终的字符的数量
public TrieNode[] nexts;
public TrieNode(){
pass = 0;
end = 0;
//nexts[0] == null 没有走向'a'的路
//nexts[0] != null 有走向'a'的路
//...
//nexts[25] != null 有走向'z'的路
nexts = new TrieNode[26]; //HashMap<Char, Node> nexts;表示很多的字符,
// Char表示某个字符,Node表示下一个节点
//TreeMap<Char, Node> nexts;有序表
}
}
public static class Trie{
private TrieNode root;
public Trie(){
root = new TrieNode();
}
public void insert(String word){
if(word == null){
return;
}
char[] chs = word.toCharArray();
TrieNode node = root;
node.pass++;//边的end的pass++
int index = 0;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if(node.nexts[index] == null){
node.nexts[index] = new TrieNode();
}
node = node.nexts[index];
node.pass++;
}
node.end++;
}
//删除前缀树中的某个单词,删一个
public void delete(String word){
if(search(word) != 0){
char[] chs = word.toCharArray();
TrieNode node = root;
node.pass--;
int index = 0;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if(--node.nexts[index].pass == 0){
node.nexts[index] = null;
return;
}
node = node.nexts[index];
}
node.end--;
}
}
//查看前缀树里有多少word
public int search(String word){
if(word == null){
return 0;
}
char[] chs = word.toCharArray();
TrieNode node = root;
int index = 0;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if(node.nexts[index] == null){
return 0;
}
node = node.nexts[index];
}
return node.end;
}
//所有加入的字符串中,有几个是以pre这个字符串为前缀的
public int prefixNumber(String pre){
if(pre == null){
return 0;
}
char[] chs = pre.toCharArray();
TrieNode node = root;
int index = 0;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if(node.nexts[index] == null){
return 0;
}
node = node.nexts[index];
}
return node.pass;
}
}
}