一、前缀树
public static class TireNode{
public int pass;
public int end;
public TireNode[] nexts;
public TireNode(){
pass = 0;
end = 0;
nexts = new TireNode[26];
}
}
public static class Tire{
private TireNode root;
public Tire(){
root = new TireNode();
}
public void insert(String word){
if(word == null){
return;
}
char[] chs = word.toCharArray();
TireNode node = root;
node.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 TireNode();
}
node = node.nexts[index];
node.pass++;
}
node.end++;
}
}
二、word之前加入过几次
public int search(String word){
if (word == null){
return 0;
}
char[] chs = word.toCharArray();
TireNode node = root;
int index = 0;
for(int i = 0; i < chs.length; i++){
index = chs[i] - 'a';
if (node.nexts[index] == null){
return 0;
}
}
return node.end;
}
三、所有加入过的字符串中,使用pre作为前缀的有几个
public int preNumber(String pre){
if(pre == null){
return 0;
}
char[] chs = pre.toCharArray();
TireNode 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;
}
四、删除
public void delete(String word){
if (search(word) != 0){
char[] chs = word.toCharArray();
TireNode 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;
}
node = node.nexts[index];
}
node.end--;
}
}