字典树又称前缀树,我们根据前缀可以快速查找出该前缀的单词。例如google的搜索:
基本结构
代码实现:
class TrieNode{
public Character c;
public boolean hasWord;
public HashMap<Character,TrieNode> children = new HashMap<>();
public TrieNode(){
}
public TrieNode(Character c){
this.c = c;
}
}
class Trie {
private TrieNode root;
/** Initialize your data structure here. */
public Trie() {
this.root = new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
TrieNode current = this.root;
char[] chars = word.toCharArray();
for(int i=0;i<chars.length;i++){
if(current.children.containsKey(chars[i])){
current = current.children.get(chars[i]);
}else{
TrieNode node = new TrieNode(chars[i]);
current.children.put(chars[i],node);
current = node;
}
if(i==chars.length-1){
current.hasWord = true;
}
}
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
TrieNode current = this.root;
char[] chars = word.toCharArray();
for(int i=0;i<chars.length;i++){
if(current.children.containsKey(chars[i])){
if(i==chars.length-1&¤t.children.get(chars[i]).hasWord){
return true;
}
current = current.children.get(chars[i]);
continue;
}else{
return false;
}
}
return false;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
TrieNode current = this.root;
char[] chars = prefix.toCharArray();
for(int i=0;i<chars.length;i++){
if(current.children.containsKey(chars[i])){
if(i==chars.length-1){
return true;
}
current = current.children.get(chars[i]);
continue;
}else{
return false;
}
}
return false;
}
}
/** * Your Trie object will be instantiated and called as such: * Trie obj = new Trie(); * obj.insert(word); * boolean param_2 = obj.search(word); * boolean param_3 = obj.startsWith(prefix); */