LeetCode-in-All

208. Implement Trie (Prefix Tree)

Medium

A trie (pronounced as “try”) or prefix tree is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There are various applications of this data structure, such as autocomplete and spellchecker.

Implement the Trie class:

Example 1:

Input

["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]

Output: [null, null, true, false, true, null, true]

Explanation:

Trie trie = new Trie();
trie.insert("apple"); trie.search("apple"); // return True
trie.search("app"); // return False
trie.startsWith("app"); // return True
trie.insert("app");
trie.search("app"); // return True 

Constraints:

Solution

class Trie() {
    private val root = new TrieNode
    private var startsWith = false

    private class TrieNode {
        val children = new Array[TrieNode](26)
        var isWord = false
    }

    def insert(word: String): Unit = {
        insert(word, root, 0)
    }

    private def insert(word: String, current: TrieNode, index: Int): Unit = {
        if (index == word.length) {
            current.isWord = true
            return
        }
        val charIndex = word.charAt(index) - 'a'
        if (current.children(charIndex) == null) {
            current.children(charIndex) = new TrieNode
        }
        insert(word, current.children(charIndex), index + 1)
    }

    def search(word: String): Boolean = {
        search(word, root, 0)
    }

    private def search(word: String, current: TrieNode, index: Int): Boolean = {
        if (index == word.length) {
            startsWith = true
            current.isWord
        } else {
            val charIndex = word.charAt(index) - 'a'
            if (current.children(charIndex) == null) {
                startsWith = false
                false
            } else {
                search(word, current.children(charIndex), index + 1)
            }
        }
    }

    def startsWith(prefix: String): Boolean = {
        search(prefix)
        startsWith
    }
}