Java实现字典树

字典树的原理类似于自动机,可以用来匹配字符串前缀,后缀也是可以的,就是将字符串倒过来。
定义两个类
节点类,定义长度为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;
   	}
}
发布了45 篇原创文章 · 获赞 4 · 访问量 1038

猜你喜欢

转载自blog.csdn.net/weixin_43838915/article/details/105161913