ImplementTriePrefixTree.java 2.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
/* All Contributors (C) 2021 */
package io.github.poorguy.explore.learn.trie;

import java.util.HashMap;
import java.util.Map;

class ImplementTriePrefixTree {
    private Character val;
    private boolean isEnd;
    private Map<Character, ImplementTriePrefixTree> children;

    /** Initialize your data structure here. */
    public ImplementTriePrefixTree() {
        val = null;
        isEnd = false;
        children = null;
    }

    /** Inserts a word into the trie. */
    public void insert(String word) {
        if (word == null || "".equals(word)) {
            return;
        }
        char[] chars = word.toCharArray();
        ImplementTriePrefixTree pointer = this;
        for (char c : chars) {
            if (pointer.children == null) {
                pointer.children = new HashMap<>();
            }
            if (pointer.children.containsKey(c)) {
                pointer = pointer.children.get(c);
            } else {
                ImplementTriePrefixTree trie = new ImplementTriePrefixTree();
                trie.val = c;
                pointer.children.put(c, trie);
                pointer = trie;
            }
        }
        pointer.isEnd = true;
    }

    /** Returns if the word is in the trie. */
    public boolean search(String word) {
        if (word == null || "".equals(word)) {
            return false;
        }
        char[] chars = word.toCharArray();
        ImplementTriePrefixTree pointer = this;
        for (char c : chars) {
            if (pointer.children == null || pointer.children.isEmpty()) {
                return false;
            }
            ImplementTriePrefixTree child = pointer.children.get(c);
            if (child == null) {
                return false;
            } else {
                pointer = child;
            }
        }
        return pointer.isEnd;
    }

    /** Returns if there is any word in the trie that starts with the given prefix. */
    public boolean startsWith(String prefix) {
        if (prefix == null || "".equals(prefix)) {
            return false;
        }
        char[] chars = prefix.toCharArray();
        ImplementTriePrefixTree pointer = this;
        for (char c : chars) {
            if (pointer.children == null || pointer.children.isEmpty()) {
                return false;
            }
            ImplementTriePrefixTree child = pointer.children.get(c);
            if (child == null) {
                return false;
            } else {
                pointer = child;
            }
        }
        return true;
    }
}

/**
 * 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);
 */