Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    [LeetCode 208] Implement Trie (Prefix Tree)

    Published Jun 22, 2022 [  Trie  ]

    Problem

    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:

    • Trie() Initializes the trie object.
    • void insert(String word) Inserts the string word into the trie.
    • boolean search(String word) Returns true if the string word is in the trie (i.e., was inserted before), and false otherwise.
    • boolean startsWith(String prefix) Returns true if there is a previously inserted string word that has the prefix prefix, and false otherwise.

    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:

    • 1 <= word.length, prefix.length <= 2000
    • word and prefix consist only of lowercase English letters.
    • At most 3 * 10^4 calls in total will be made to insert, search, and startsWith.

    TypeScript

    class TrieNode {
        children: Map<string, TrieNode>;
        isEnd: boolean;
        
        constructor(){
            this.children = new Map<string, TrieNode>()
            this.isEnd = false;
        }
    }
    
    class Trie {
        root: TrieNode;
        
        constructor() {
            this.root = new TrieNode()
        }
    
        insert(word: string): void {
            let cur: TrieNode = this.root;
            for(let c of word){
                if(!cur.children.has(c)) cur.children.set(c, new TrieNode())
                cur = cur.children.get(c)
            }
            cur.isEnd = true;
        }
    
        search(word: string): boolean {
            let cur: TrieNode = this.root;
            for(let c of word){
                if(!cur.children.has(c)) return false;
                cur = cur.children.get(c)
            }
            return cur.isEnd;
        }
    
        startsWith(prefix: string): boolean {
            let cur: TrieNode = this.root;
            for(let c of prefix){
                if(!cur.children.has(c)) return false;
                cur = cur.children.get(c)
            }
            return true;
        }
    }
    

    Reference