就是一棵字符串的树
用途:方便,查找字符串的出现个数,和是否存在,以及前缀查找
package com.hnist.lzn.Trie;
public class TrieTest {
static class TrieNode {
int path;
int end;
TrieNode[] next;
public TrieNode() {
path = 0;
end = 0;
next = new TrieNode[26];
}
}
public static class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) {
if (word == null)
return;
char[] chas = word.toCharArray();
TrieNode head = this.root;
int index = 0;
for(int i = 0;i<chas.length;i++)
{
index = chas[i]-'a';
if(head.next[index] == null)
head.next[index] = new TrieNode();
//head.next[index].path++;
head = head.next[index];
head.path++;
}
head.end++;
}
public void delete(String word)
{
if(search(word)!=0) {
char[] cha = word.toCharArray();
TrieNode node = root;
int index = 0;
for(int i = 0;i<cha.length;i++)
{
index = cha[i]-'a';
if((node.next[index] != null &&--node.next[index].path == 0 ) || node.next[index] == null)
{
node.next[index] = null;
return;
}
node = node.next[index];
}
node.end--;
}
}
public int search(String word){
char[] chas = word.toCharArray();
TrieNode head = this.root;
int index = 0;
for(int i = 0;i<chas.length;i++)
{
index = chas[i]-'a';
if(head.next[index] == null)
return 0;
//head.next[index].path++;
head = head.next[index];
}
return head.end;
}
public int prefix(String pri)
{
if(pri == null)
return 0;
char[] chas = pri.toCharArray();
TrieNode head = this.root;
int index = 0;
for(int i = 0;i<chas.length;i++)
{
index = chas[i]-'a';
if(head.next[index] == null)
return 0;
//head.next[index].path++;
head = head.next[index];
}
return head.path;
}
}
}
时间复杂度:mlogN m单词长度,n是树的层数、