参考一下文章,写代码自己记录下
数据结构与算法:字典树(前缀树)
字典树节点
class TrieNode {
//表示以当前单词结尾的单词数量。
int count;
//表示以当前节点之前(包括当前节点)的字符串为前缀的字符串个数
// 表示以该处节点之前的字符串为前缀的单词数量
int prefix;
TrieNode[] nextNode = new TrieNode[26];
public TrieNode() {
count = 0;
prefix = 0;
}
}
插入字符串
public static void insert(TrieNode node, String str) {
if (node == null || str == null || str.length() == 0) {
return;
}
int length = str.length();
for (int i = 0; i < length; i++) {
int index = str.charAt(i) - 'a';
if (node.nextNode[index] == null) {
node.nextNode[index] = new TrieNode();
}
node = node.nextNode[index];
node.prefix++;
}
node.count++;
}
搜索字符串个数
查找该单词是否存在,如果存在返回数量,不存在返回-1
public static int search(TrieNode node, String str) {
if (node == null || str == null || str.length() == 0) {
return -1;
}
int length = str.length();
for (int i = 0; i < length; i++) {
int index = str.charAt(i) - 'a';
if (node.nextNode[index] == null) {
return -1;
}
node = node.nextNode[index];
}
return node.count == 0 ? -1 : node.count;
}
搜索以字符串为前缀的字符串个数
查询以str为前缀的单词数量
public static int searchPrefix(TrieNode node, String str) {
if (node == null || str == null || str.length() == 0) {
return -1;
}
int length = str.length();
for (int i = 0; i < length; i++) {
int index = str.charAt(i) - 'a';
if (node.nextNode[index] == null) {
return -1;
}
node = node.nextNode[index];
}
return node.prefix;
}
另外一种理解
字典树节点
private class TrieNode{
TrieNode[] children;
boolean endFlag;
public TrieNode(){
children = new TrieNode[26];
endFlag = false;
}
}
class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) {
TrieNode node = root;
for(int i=0; i<word.length(); i++){
char ch = word.charAt(i);
int index = ch - 'a';
if(node.children[index] == null){
node.children[index] = new TrieNode();
}
node = node.children[index];
}
node.endFlag = true;
}
public boolean search(String word) {
TrieNode node = stearchPrefix(word);
if(node != null && node.endFlag){
return true;
}else{
return false;
}
}
public boolean startsWith(String prefix) {
TrieNode node = stearchPrefix(prefix);
return node!=null;
}
public TrieNode stearchPrefix(String prefix) {
TrieNode node = root;
for(int i=0; i<prefix.length(); i++){
char ch = prefix.charAt(i);
int index = ch - 'a';
if(node.children[index] == null){
return null;
}
node = node.children[index];
}
return node;
}
}