前缀树是将之前的信息给存到一棵树中,然后当下一个字符串加进来的时候,将其转化为字符数组,看看当前字符是否在这个前缀树中,若存在就经过那条路径,然后路径上的path加1,若不存在就新建一条路径。
package Code07;
public class Code01_TrieTree {
public static class TrieNode{
public int path;
public int end;
public TrieNode[] nexts;
public TrieNode(){
path = 0;
end = 0;
nexts = new TrieNode[26];
}
}
public static class Trie{
private TrieNode root;
public Trie(){
root = new TrieNode();
}
//插入一个Word,在经过的路径上面加一,然后最后end代表的是这个单词在前缀树中出现的次数。
public void insert(String word){
if(word == null){
return ;
}
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){
node.nexts[index] = new TrieNode();
}
node = node.nexts[index];
node.path++;
}
node.end++;
}
//删除Word,在删除的过程中如果一个path减一之后为零就说明这条路只有当前这个单词来过,这样和面的路径就不不要看了,将当前的数组设置成为null就可以了。
public void delete(String word){
if(search(word) != 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].path == 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.path;
}
}
public static void main(String[] args) {
}
}