public class PrefixTree {
/*
* 前缀树:以26位字母作为前缀树
*/
Node<Character > head = new Node<>();
public static void main(String[] args) {
PrefixTree prefixTree = new PrefixTree();
prefixTree.insert("abcdef");
prefixTree.insert("aecd");
prefixTree.insert("aecd");
prefixTree.insert("abcde");
prefixTree.insert("aecdsss");
int times = prefixTree.searchTimes("aecd");
int likeTimes = prefixTree.searchTimesByLike("ae");
System.out.println("times:"+times);
System.out.println("likeTimes:"+likeTimes);
prefixTree.delete("aecd");
times = prefixTree.searchTimes("aecd");
likeTimes = prefixTree.searchTimesByLike("ae");
System.out.println("times:"+times);
System.out.println("likeTimes:"+likeTimes);
}
//插入一个字符串形成前缀树
public void insert(String str) {
if(StringUtils.isEmpty(str)) {
return;
}
char[] charArr = str.toLowerCase().toCharArray();
Node<Character> node = head;
node.pass++;//记录总数
for(int i =0;i<charArr.length;i++) {
char item = charArr[i];
int index = item - 'a';
Node[] nextNodeArr = node.nextNodeArr;
if(nextNodeArr == null) {
nextNodeArr = new Node[26];
node.nextNodeArr = nextNodeArr;
Node<Character> nextNode = new Node<>(item);
nextNodeArr[index] = nextNode;
node = nextNode;
}else {
Node<Character> nextNode = nextNodeArr[index];
if(nextNode == null) {
nextNode = new Node<>(item);
nextNodeArr[index] = nextNode;
}
node = nextNode;
}
node.pass++;
}
node.end++;
}
//删除前缀
public void delete(String str) {
if(StringUtils.isEmpty(str)) {
return;
}
//先判断该删除的前缀是否存在
int times = searchTimes(str);
if(times ==0) {
return;
}
//不断的遍历获取知道通过次数为0 说明只有这个删除字符前缀了
char[] charArr = str.toLowerCase().toCharArray();
Node<Character> node = head;
for(int i =0;i<charArr.length;i++) {
char item = charArr[i];
int index = item - 'a';
Node[] nextNodeArr = node.nextNodeArr;
Node nextNode = nextNodeArr[index];
nextNode.pass--;
if(nextNode.pass==0) {
nextNodeArr[index] = null;
break;
}
node = nextNode;
}
//走到这里说明有重复的删除字符前缀
node.end--;
}
//查询次数
public int searchTimes(String str) {
if(StringUtils.isEmpty(str)) {
return 0;
}
char[] charArr = str.toLowerCase().toCharArray();
Node<Character> node = head;
for(int i =0;i<charArr.length;i++) {
char item = charArr[i];
int index = item - 'a';
Node[] nextNodeArr = node.nextNodeArr;
if(nextNodeArr == null) {
return 0;
}
Node nextNode = nextNodeArr[index];
if(nextNode == null) {
return 0;
}
node = nextNode;
}
return node.end;
}
//模糊查询次数
public int searchTimesByLike(String str) {
if(StringUtils.isEmpty(str)) {
return 0;
}
char[] charArr = str.toLowerCase().toCharArray();
Node<Character> node = head;
for(int i =0;i<charArr.length;i++) {
char item = charArr[i];
int index = item - 'a';
Node[] nextNodeArr = node.nextNodeArr;
if(nextNodeArr == null) {
return 0;
}
Node nextNode = nextNodeArr[index];
if(nextNode == null) {
return 0;
}
node = nextNode;
}
return node.pass;
}
}
class Node<T>{
T item;
//通过数量
int pass;
//结尾数量
int end;
//下一位数量
Node[] nextNodeArr;
public Node() {}
public Node(T item) {
this.item = item;
}
}