字典树又称前缀树,我们根据前缀可以快速查找出该前缀的单词。例如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&&current.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); */