1)插入一个字符串到前缀树中
2)查找一个字符串是否在前缀树中存在
3)在前缀树中删除一个自定的字符串
4)查看指定前缀在前缀树中出现过多少次
public class C01_TrieTree {
public static class TrieTree{
public int end;//字符串结束标志
public int path;//字符串经过的标志
TrieTree[] next ;//
public TrieTree(){
end = 0;
path = 0;
next = new TrieTree[26];//假设只含有26个小写字母
}
}
public static class Trie{
//新建一个头节点
private TrieTree root ;
public Trie(){
root = new TrieTree();
}
//插入一个字符串
public void insert(String word){
if(word==null){
return ;
}
char[]ch = word.toCharArray();
TrieTree node = root;
int index = 0;
for (int i = 0; i < ch.length; i++) {
index = ch[i]-'a';
if(node.next[index]==null){
node.next[index] = new TrieTree();
}
node = node.next[index];
node.path++;//下一个++
}
node.end++;
}
//查找是否存在word(并返回个数)
public int search(String word){
if(word==null){
return 0;
}
TrieTree node = root;
int index = 0;
char[]ch = word.toCharArray();
for (int i = 0; i < ch.length; i++) {
index = ch[i]-'a';
if(node.next[index]==null){
return 0;
}
node = node.next[index];
}
return node.end;
}
//删除指定单词(只是删除一次)
public void delete(String word) {
if(search(word)<=0){
return ;
}
TrieTree node = root;
char[]ch = word.toCharArray();
int index = 0;
for (int i = 0; i < ch.length; i++) {
index = ch[i]-'a';
if(--node.next[index].path==0){//如果经过的次数已经为零了,下面的就不用管了
node.next[index] = null;//下一个指向空
return ;
}
node = node.next[index];
}
node.end--;
}
//指定前缀出现了几次
public int prefixNumber(String pre) {
if(pre==null){
return 0;
}
TrieTree node = root;
int index = 0;
char[]ch = pre.toCharArray();
for (int i = 0; i < ch.length; i++) {
index = ch[i]-'a';
if(node.next[index]==null){
return 0;
}
node = node.next[index];
}
return node.path;
}
}
public static void main(String[] args) {
Trie trie = new Trie();
System.out.println(trie.search("sube"));//0
trie.insert("sube");
System.out.println(trie.search("sube"));//1
trie.delete("sube");
System.out.println(trie.search("sube"));//0
trie.insert("sube");
trie.insert("sube");
trie.delete("sube");
System.out.println(trie.search("sube"));//1
trie.delete("sube");
System.out.println(trie.search("sube"));//0
trie.insert("subea");
trie.insert("subeac");
trie.insert("subeab");
trie.insert("subead");
trie.delete("subea");
System.out.println(trie.search("subea"));//0
System.out.println(trie.prefixNumber("sube"));//3
}
}