208. Implement Trie (Prefix Tree)

Problem Statement

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 * 104 calls in total will be made to insert, search, and startsWith.

Intuition

Approach:

Make a reference trie (struct node) for each alphabet

https://leetcode.com/problems/implement-trie-prefix-tree/description/

https://www.youtube.com/watch?v=dBGUmUQhjaM&ab_channel=takeUforward

Approach 1:

C++
struct Node{
  Node* links[26];
  bool flag = false;
};

class Trie {
public:
    Node* root;
    Trie() {
        root = new Node();
    }
    void insert(string s) {
        Node* temp = root;
        for(int i=0; i<s.size(); i++){
            char ch = s[i];
            if(temp->links[ch-'a'] == nullptr)
                temp->links[ch-'a'] = new Node();

            temp = temp->links[ch-'a'];
        }

        temp->flag = true;
    }

    bool search(string s) {
        Node *temp = root;
        for(int i=0; i<s.size(); i++){
            char ch = s[i];
            if(temp->links[ch-'a'] == nullptr)
                return false;

            temp = temp->links[ch-'a'];
        }

        if(temp->flag)
            return true;

        return false;
    }

    bool startsWith(string s) {
        Node* temp = root;
        for(int i=0; i<s.size(); i++){
            char ch = s[i];
            if(temp->links[ch - 'a'] == nullptr)
                return false;

            temp = temp->links[ch - 'a'];
        }

        return true;
    }
};

Approach 2:

C++

Approach 3:

C++

Approach 4:

C++

Similar Problems

Last updated