字典树的原理类似于自动机,可以用来匹配字符串前缀,后缀也是可以的,就是将字符串倒过来。
定义两个类
节点类,定义长度为26的数组用来表示这个节点的下一位包含这些字母中的哪一个,一个判断值表示这个节点是否是一个字符串的最后一个节点,因为可以有多个字符串在树的同一路径。
节点类用于处理每一个字符
class trienode{
private boolean isend;//是否是某个字符串的最后一个字符
trienode []node;//下一个位置可能的取值
trienode(){
node=new trienode[26];
isend=false;
}
boolean contain(char key)//下一个字符是否有key这个字符
{
return node[key-'a']!=null;
}
trienode get(char key)//返回值为key的字符的节点
{
if(node[key-'a']==null)
return null;
else return node[key-'a'];
}
void put(char key,trietree keynode)//把key放入node的下一位,keynode是下一个节点
{
node[key-'a']=keynode;
}
void setend(){//该字符是某个字符串的最后一个字符
isend=true;
}
boolean isend(){//判断该字符是某个字符串的最后一个字符
return isend;
}
}
字典树树类,用于处理整个字符串
class trie{
trienode root;
trie(){
root=new trienode();
}
void insert(String word){
trienode node=root;//从根节点开始找,根节点没有值
for(int i=0;i<word.length();i++)
{
if(!node.contain(word.charAt(i))//下一个位置没有该字符,把这个字符加入下一个位置的字符数组
put(word.charAt(i),new trienode());
node=get(word.charAt(i));//节点移动到字符所在位置
}
node.setend();//字符串放入树,在最后一个字符串处做上标记
}
boolean search(String word){
trienode node=root;//从根节点开始找,根节点没有值
int i=0;
for(;i<word.length();i++)
{
if(node.contain(word.charAt(i))
node=node.get(word.charAt(i));//下一位有这个字符,移动到下一位
else break;
}
if(node.isend()==false&&i<word.length())//没有遍历完全,或者该字符只是一个单词的前缀,并不是真的存在字典中
return false;
else return true;
}
boolean startwith(String word){//判断是否存在该前缀
trienode node=root;//从根节点开始找,根节点没有值
int i=0;
for(;i<word.length();i++)
{
if(node.contain(word.charAt(i))
node=node.get(word.charAt(i));
else {
break;
}
}
if(i==word.length())/只要这段字符遍历完了就存在这个前缀
return true;
else return false;
}
}