0
0
DSA Typescriptprogramming~20 mins

Count Words with Given Prefix in DSA Typescript - Practice Problems & Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Prefix Counting Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of countWordsStartingWith after insertions
What is the output of the following TypeScript code that inserts words and counts how many start with a given prefix?
DSA Typescript
class TrieNode {
  children: Map<string, TrieNode> = new Map();
  count: number = 0;
}

class Trie {
  root: TrieNode = new TrieNode();

  insert(word: string): void {
    let node = this.root;
    for (const ch of word) {
      if (!node.children.has(ch)) {
        node.children.set(ch, new TrieNode());
      }
      node = node.children.get(ch)!;
      node.count++;
    }
  }

  countWordsStartingWith(prefix: string): number {
    let node = this.root;
    for (const ch of prefix) {
      if (!node.children.has(ch)) {
        return 0;
      }
      node = node.children.get(ch)!;
    }
    return node.count;
  }
}

const trie = new Trie();
trie.insert("apple");
trie.insert("app");
trie.insert("application");
trie.insert("apt");
trie.insert("bat");

console.log(trie.countWordsStartingWith("app"));
A4
B2
C3
D1
Attempts:
2 left
💡 Hint
Count how many inserted words start with 'app'.
Predict Output
intermediate
2:00remaining
Result of countWordsStartingWith for a prefix not present
What will be the output of the code when counting words starting with prefix 'cat' after inserting some words?
DSA Typescript
class TrieNode {
  children: Map<string, TrieNode> = new Map();
  count: number = 0;
}

class Trie {
  root: TrieNode = new TrieNode();

  insert(word: string): void {
    let node = this.root;
    for (const ch of word) {
      if (!node.children.has(ch)) {
        node.children.set(ch, new TrieNode());
      }
      node = node.children.get(ch)!;
      node.count++;
    }
  }

  countWordsStartingWith(prefix: string): number {
    let node = this.root;
    for (const ch of prefix) {
      if (!node.children.has(ch)) {
        return 0;
      }
      node = node.children.get(ch)!;
    }
    return node.count;
  }
}

const trie = new Trie();
trie.insert("dog");
trie.insert("deer");
trie.insert("deal");

console.log(trie.countWordsStartingWith("cat"));
A0
B1
C3
D2
Attempts:
2 left
💡 Hint
Check if any inserted word starts with 'cat'.
🔧 Debug
advanced
2:30remaining
Identify the bug in countWordsStartingWith method
The following TypeScript code is supposed to count how many words start with a given prefix. However, it returns incorrect results. What is the bug?
DSA Typescript
class TrieNode {
  children: Map<string, TrieNode> = new Map();
  count: number = 0;
}

class Trie {
  root: TrieNode = new TrieNode();

  insert(word: string): void {
    let node = this.root;
    for (const ch of word) {
      if (!node.children.has(ch)) {
        node.children.set(ch, new TrieNode());
      }
      node = node.children.get(ch)!;
    }
    node.count++;
  }

  countWordsStartingWith(prefix: string): number {
    let node = this.root;
    for (const ch of prefix) {
      if (!node.children.has(ch)) {
        return 0;
      }
      node = node.children.get(ch)!;
    }
    return node.count;
  }
}
AThe insert method does not create new nodes for characters.
BThe count is incremented only at the end node, so intermediate nodes have count 0, causing wrong prefix counts.
CThe countWordsStartingWith method does not check if prefix exists.
DThe root node's count is incremented incorrectly.
Attempts:
2 left
💡 Hint
Think about when counts are updated during insertion.
Predict Output
advanced
2:30remaining
Output after multiple insertions and prefix counts
Given the following code, what is the output of the two console.log statements?
DSA Typescript
class TrieNode {
  children: Map<string, TrieNode> = new Map();
  count: number = 0;
}

class Trie {
  root: TrieNode = new TrieNode();

  insert(word: string): void {
    let node = this.root;
    for (const ch of word) {
      if (!node.children.has(ch)) {
        node.children.set(ch, new TrieNode());
      }
      node = node.children.get(ch)!;
      node.count++;
    }
  }

  countWordsStartingWith(prefix: string): number {
    let node = this.root;
    for (const ch of prefix) {
      if (!node.children.has(ch)) {
        return 0;
      }
      node = node.children.get(ch)!;
    }
    return node.count;
  }
}

const trie = new Trie();
trie.insert("car");
trie.insert("card");
trie.insert("care");
trie.insert("cart");
trie.insert("cat");

console.log(trie.countWordsStartingWith("car"));
console.log(trie.countWordsStartingWith("ca"));
A
4
5
B
4
4
C
3
5
D
3
4
Attempts:
2 left
💡 Hint
Count words starting with 'car' and 'ca'.
🧠 Conceptual
expert
3:00remaining
Why use a Trie for counting words with a prefix?
Which of the following is the main advantage of using a Trie data structure to count how many words start with a given prefix compared to scanning all words in a list?
ATrie automatically removes duplicate words.
BTrie stores words in sorted order, so counting is faster.
CTrie uses less memory than storing words in a list.
DTrie allows prefix counts in time proportional to prefix length, not total words.
Attempts:
2 left
💡 Hint
Think about how prefix queries scale with number of words.