Bird
Raised Fist0
DSA C++programming~5 mins

Autocomplete System with Trie in DSA C++ - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a Trie data structure?
A Trie is a tree-like data structure that stores a dynamic set of strings, where each node represents a character. It is used to efficiently search for words with common prefixes.
Click to reveal answer
beginner
How does a Trie help in implementing autocomplete?
A Trie allows quick lookup of all words starting with a given prefix by traversing nodes matching the prefix, then collecting all descendant words.
Click to reveal answer
intermediate
What is the time complexity to insert a word of length n into a Trie?
The time complexity is O(n), where n is the length of the word, because each character is inserted one by one along the path.
Click to reveal answer
intermediate
Explain how to find all words with a given prefix in a Trie.
First, traverse the Trie nodes matching the prefix characters. Then, from the last node, perform a depth-first search to collect all complete words below it.
Click to reveal answer
intermediate
Why is Trie preferred over hash maps for autocomplete systems?
Trie stores words in a prefix-sharing way, saving space and allowing prefix queries efficiently. Hash maps do not support prefix search directly.
Click to reveal answer
What does each node in a Trie represent?
AA sentence
BA whole word
CA number
DA character
What is the first step to find autocomplete suggestions in a Trie?
ASort all words
BTraverse nodes matching the prefix
CDelete words
DInsert new words
What is the worst-case time complexity to search for a prefix of length n in a Trie?
AO(n)
BO(n^2)
CO(1)
DO(log n)
Which of these is NOT a benefit of using Trie for autocomplete?
AMemory efficient for all cases
BEfficient prefix search
CFast insertion of words
DSupports prefix-based suggestions
After reaching the prefix node in a Trie, what algorithm is commonly used to find all suggestions?
ABreadth-first search
BBinary search
CDepth-first search
DSorting
Describe how you would implement an autocomplete system using a Trie.
Think about storing words and searching by prefix.
You got /4 concepts.
    Explain the advantages and disadvantages of using a Trie for autocomplete.
    Consider speed and memory trade-offs.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using a Trie in an autocomplete system?
      easy
      A. To efficiently store and search prefixes of words
      B. To sort words alphabetically
      C. To store words in a linked list
      D. To perform arithmetic operations on words

      Solution

      1. Step 1: Understand the role of Trie in prefix search

        A Trie is a tree-like data structure that stores characters of words in a way that common prefixes share nodes.
      2. Step 2: Connect Trie usage to autocomplete

        Autocomplete requires quick lookup of words starting with a given prefix, which Trie supports efficiently by traversing prefix nodes.
      3. Final Answer:

        To efficiently store and search prefixes of words -> Option A
      4. Quick Check:

        Trie = prefix search [OK]
      Hint: Trie is all about prefix matching fast [OK]
      Common Mistakes:
      • Confusing Trie with sorting structures
      • Thinking Trie stores words linearly
      • Assuming Trie does arithmetic
      2. Which of the following is the correct way to declare a Trie node class in C++?
      easy
      A. class TrieNode { public: map children; bool isEnd; };
      B. class TrieNode { int children[26]; bool isEnd; };
      C. class TrieNode { public: TrieNode* children[26]; bool isEnd; TrieNode() { for(int i=0; i<26; i++) children[i] = nullptr; isEnd = false; } };
      D. struct TrieNode { vector<int> children; bool isEnd; };

      Solution

      1. Step 1: Check for pointer array initialization

        class TrieNode { public: TrieNode* children[26]; bool isEnd; TrieNode() { for(int i=0; i<26; i++) children[i] = nullptr; isEnd = false; } }; correctly declares an array of 26 pointers to TrieNode, initialized to nullptr, representing children for each alphabet letter.
      2. Step 2: Verify isEnd boolean initialization

        class TrieNode { public: TrieNode* children[26]; bool isEnd; TrieNode() { for(int i=0; i<26; i++) children[i] = nullptr; isEnd = false; } }; sets isEnd to false in constructor, which marks if a word ends at this node.
      3. Final Answer:

        class TrieNode { public: TrieNode* children[26]; bool isEnd; TrieNode() { for(int i=0; i<26; i++) children[i] = nullptr; isEnd = false; } }; -> Option C
      4. Quick Check:

        Pointer array + bool flag = class TrieNode { public: TrieNode* children[26]; bool isEnd; TrieNode() { for(int i=0; i<26; i++) children[i] = nullptr; isEnd = false; } }; [OK]
      Hint: Trie nodes use pointer arrays for children [OK]
      Common Mistakes:
      • Using int array instead of pointer array
      • Not initializing children pointers
      • Using map<int> instead of map<char>
      3. What will be the output of the following C++ code snippet that inserts words into a Trie and searches for prefix "app"?
      class TrieNode {
      public:
          TrieNode* children[26];
          bool isEnd;
          TrieNode() {
              for(int i=0; i<26; i++) children[i] = nullptr;
              isEnd = false;
          }
      };
      
      class Trie {
      public:
          TrieNode* root;
          Trie() { root = new TrieNode(); }
      
          void insert(string word) {
              TrieNode* node = root;
              for(char c : word) {
                  int idx = c - 'a';
                  if(!node->children[idx])
                      node->children[idx] = new TrieNode();
                  node = node->children[idx];
              }
              node->isEnd = true;
          }
      
          bool startsWith(string prefix) {
              TrieNode* node = root;
              for(char c : prefix) {
                  int idx = c - 'a';
                  if(!node->children[idx]) return false;
                  node = node->children[idx];
              }
              return true;
          }
      };
      
      int main() {
          Trie trie;
          trie.insert("apple");
          trie.insert("app");
          cout << (trie.startsWith("app") ? "Yes" : "No") << endl;
          cout << (trie.startsWith("apl") ? "Yes" : "No") << endl;
          return 0;
      }
      medium
      A. No Yes
      B. Yes No
      C. Yes Yes
      D. No No

      Solution

      1. Step 1: Insert words "apple" and "app" into Trie

        Both words share prefix "app", so nodes for 'a', 'p', 'p' exist. "apple" adds nodes for 'l' and 'e'.
      2. Step 2: Check startsWith for "app" and "apl"

        "app" prefix exists, so returns true (prints "Yes"). "apl" prefix does not exist (no 'l' after 'p'), so returns false (prints "No").
      3. Final Answer:

        Yes No -> Option B
      4. Quick Check:

        Prefix "app" found, "apl" not found = Yes No [OK]
      Hint: Check prefix nodes existence for startsWith [OK]
      Common Mistakes:
      • Confusing isEnd with prefix existence
      • Assuming "apl" is found because 'a' and 'p' exist
      • Printing boolean instead of Yes/No
      4. Identify the bug in this Trie insertion code snippet:
      void insert(string word) {
          TrieNode* node = root;
          for(char c : word) {
              int idx = c - 'a';
              if(node->children[idx] == nullptr)
                  node->children[idx] = new TrieNode();
              node = node->children[idx];
              node->isEnd = true;
          }
      }
      medium
      A. Setting isEnd = true inside the loop causes all prefixes to be marked as words
      B. Not initializing children array to nullptr
      C. Missing root initialization
      D. Incorrect index calculation for children array

      Solution

      1. Step 1: Analyze isEnd assignment inside loop

        Setting isEnd = true inside the loop marks every node along the word as an end of a word, incorrectly marking prefixes as complete words.
      2. Step 2: Correct placement of isEnd assignment

        isEnd should be set to true only after the loop ends, marking only the last node as end of the inserted word.
      3. Final Answer:

        Setting isEnd = true inside the loop causes all prefixes to be marked as words -> Option A
      4. Quick Check:

        isEnd inside loop = wrong word marking [OK]
      Hint: Set isEnd true only after full word insertion [OK]
      Common Mistakes:
      • Marking prefixes as complete words
      • Forgetting to set isEnd at all
      • Incorrect children pointer checks
      5. You want to implement an autocomplete system that returns all words starting with a given prefix using a Trie. Which approach correctly retrieves all such words?
      hard
      A. Use a hash map to store prefix to word list mapping directly
      B. Store all words in a vector and filter by prefix each time
      C. Traverse Trie and return words only if isEnd is true at prefix node
      D. Traverse Trie to prefix node, then perform DFS to collect all words below it

      Solution

      1. Step 1: Locate prefix node in Trie

        Traverse the Trie character by character to reach the node representing the last character of the prefix.
      2. Step 2: Perform DFS from prefix node to collect words

        From this node, recursively explore all child nodes to find all words that start with the prefix, collecting those where isEnd is true.
      3. Final Answer:

        Traverse Trie to prefix node, then perform DFS to collect all words below it -> Option D
      4. Quick Check:

        Prefix node + DFS = all autocomplete words [OK]
      Hint: Find prefix node, then DFS to get all words [OK]
      Common Mistakes:
      • Returning only prefix node word ignoring children
      • Filtering all words each query (inefficient)
      • Using hash map without Trie traversal
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard