又称单词查找树,字典树,前缀树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
class Trie {
Trie[] next;
boolean isEnd = false;
public Trie() {
next = new Trie[26];
}
public void insert(String word) {
Trie curr = this;
for (char c : word.toCharArray()) {
if (curr.next[c - 'a'] == null) {
curr.next[c - 'a'] = new Trie();
}
curr = curr.next[c - 'a'];
}
curr.isEnd = true;
}
public boolean search(String word) {
Trie curr = this;
for (char c : word.toCharArray()) {
if (curr.next[c - 'a'] == null) return false;
curr = curr.next[c - 'a'];
}
return curr.isEnd;
}
public boolean startsWith(String prefix) {
Trie curr = this;
for (char c : prefix.toCharArray()) {
if (curr.next[c - 'a'] == null) return false;
curr = curr.next[c - 'a'];
}
return true;
}
}
// 前缀树
class Trie {
static class Node {
public char ch;
public boolean isExist;
public Map<Character, Node> next = new HashMap<>();
public Node(){}
public Node(char ch) {
this.ch = ch;
}
}
Node head;
/** Initialize your data structure here. */
public Trie() {
head = new Node();
}
/** Inserts a word into the trie. */
public void insert(String word) {
Node cur = head;
for(int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);
if(cur.next.containsKey(ch)){
cur = cur.next.get(ch);
} else {
cur.next.put(ch, new Node());
cur = cur.next.get(ch);
}
}
cur.isExist = true;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
Node cur = head;
for(int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);
if(!cur.next.containsKey(ch)){
return false;
}
cur = cur.next.get(ch);
}
return cur.isExist;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
Node cur = head;
for(int i = 0; i < prefix.length(); i++) {
char ch = prefix.charAt(i);
if(!cur.next.containsKey(ch)){
return false;
}
cur = cur.next.get(ch);
}
return true;
}
}