字典树,是一种空间换时间的数据结构,又称Trie树、前缀树,是一种树形结构(字典树是一种数据结构),典型用于统计、排序、和保存大量字符串。
所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高
对于字典树,有三个重要性质:
- 根节点不包含字符,除了根节点每个节点都只包含一个字符。root节点不含字符这样做的目的是为了能够包括所有字符串。
- 从根节点到某一个节点,路过字符串起来就是该节点对应的字符串。
- 每个节点的子节点字符不同,也就是找到对应单词、字符是唯一的。
应用:
字符串检索、文本预测、自动完成,see also,拼写检查、词频统计、排序、字符串最长公共前缀、字符串搜索的前缀匹配、作为其他数据结构和算法的辅助结构等等。
class Trie {
class TrieNode {
TrieNode[] son;
//结束标志
boolean isEnd;
//初始化
public TrieNode() {
son=new TrieNode[26];
}
}
TrieNode root;
/** Initialize your data structure here. */
public Trie() {
root = new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
//临时节点用来枚举
TrieNode node=root;
//枚举字符串
for(int i=0;i<word.length();i++) {
//找到26个对应位置
int index=word.charAt(i)-'a';
//如果为空需要创建
if(node.son[index]==null) {
node.son[index]=new TrieNode();
}
node=node.son[index];
}
//最后一个节点
node.isEnd=true;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
TrieNode node = root;
for (int i = 0; i < word.length(); i++) {
int index = word.charAt(i) - 'a';
if (node.son[index] != null) {
node = node.son[index];
} else {
return false;
}
}
return node.isEnd;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
TrieNode node = root;
for (int i = 0; i < prefix.length(); i++) {
int index = prefix.charAt(i) - 'a';
if (node.son[index] != null) {
node = node.son[index];
} else {
return false;
}
}
return true;
}
}
见力扣208