📖 Scenario: Imagine you are building a text search tool that quickly finds if a small pattern exists inside a large text. This is useful in searching documents, DNA sequences, or logs.
🎯 Goal: You will implement the Knuth-Morris-Pratt (KMP) algorithm in TypeScript to efficiently find all starting positions of a pattern inside a given text.
📋 What You'll Learn
Create a string variable text with the exact value 'ABABDABACDABABCABAB'
Create a string variable pattern with the exact value 'ABABCABAB'
Create a function computeLPSArray that computes the longest prefix suffix (LPS) array for the pattern
Create a function KMPsearch that uses the LPS array to find all occurrences of the pattern in the text
Print the array of starting indices where the pattern is found in the text
💡 Why This Matters
🌍 Real World
Text search is used in search engines, DNA sequence analysis, plagiarism detection, and log scanning.
💼 Career
Understanding KMP helps in roles involving algorithms, software development, and data processing where efficient pattern matching is needed.
Progress0 / 4 steps
1
Create the text and pattern strings
Create a string variable called text with the exact value 'ABABDABACDABABCABAB' and a string variable called pattern with the exact value 'ABABCABAB'.
DSA Typescript
Hint
Use const to declare both text and pattern with the exact given strings.
2
Create the LPS array computation function
Create a function called computeLPSArray that takes a string pattern and returns a number array representing the longest prefix suffix (LPS) array for the pattern.
DSA Typescript
Hint
The LPS array stores the length of the longest proper prefix which is also a suffix for each substring of the pattern.
3
Create the KMP search function
Create a function called KMPsearch that takes text and pattern strings and returns an array of numbers representing all starting indices where pattern is found in text. Use the computeLPSArray function inside it.
DSA Typescript
Hint
Use two pointers to scan text and pattern. Use the LPS array to skip unnecessary comparisons.
4
Print the result of KMP search
Print the result of calling KMPsearch(text, pattern) to display the array of starting indices where the pattern is found in the text.
DSA Typescript
Hint
Call console.log(KMPsearch(text, pattern)) to print the array of starting indices.
Practice
(1/5)
1. What is the main purpose of the KMP (Knuth-Morris-Pratt) algorithm in pattern matching?
easy
A. To efficiently find occurrences of a pattern string within a text string without rechecking characters
B. To sort an array of numbers in ascending order
C. To reverse a string in linear time
D. To find the maximum element in an array
Solution
Step 1: Understand KMP algorithm goal
KMP is designed to find all occurrences of a pattern in a text efficiently.
Step 2: Compare with other options
Sorting, reversing, or finding max are unrelated to pattern matching.
Final Answer:
To efficiently find occurrences of a pattern string within a text string without rechecking characters -> Option A
Quick Check:
KMP purpose = efficient pattern search [OK]
Hint: KMP avoids rechecking matched characters during search [OK]
Common Mistakes:
Confusing KMP with sorting algorithms
Thinking KMP reverses strings
Assuming KMP finds max elements
2. Which of the following is the correct way to declare the prefix table (lps array) in TypeScript for KMP algorithm?
easy
A. var lps = new Array(pattern);
B. let lps = pattern.length();
C. const lps: number[] = new Array(pattern.length).fill(0);
D. const lps = Array(pattern.length);
Solution
Step 1: Understand correct array initialization in TypeScript
To create an array of numbers with fixed length and initialize with zeros, use new Array(length).fill(0).
Step 2: Check each option
const lps: number[] = new Array(pattern.length).fill(0); correctly creates a number array of pattern length filled with 0. Others are incorrect syntax or wrong usage.
Final Answer:
const lps: number[] = new Array(pattern.length).fill(0); -> Option C
Quick Check:
Array init with zeros = const lps: number[] = new Array(pattern.length).fill(0); [OK]
Hint: Use new Array(length).fill(0) to initialize numeric arrays [OK]
Common Mistakes:
Using parentheses instead of property for length
Not filling array with zeros
Passing string instead of length to Array constructor
3. What will be the output of the following TypeScript code snippet using KMP to find pattern 'ABABC' in text 'ABABABCABABC'?
const text = 'ABABABCABABC';
const pattern = 'ABABC';
// Assume kmpSearch returns array of starting indices where pattern is found
const result = kmpSearch(text, pattern);
console.log(result);
medium
A. [3, 8]
B. [0, 5]
C. [1, 6]
D. [2, 7]
Solution
Step 1: Identify pattern occurrences in text
Check text 'ABABABCABABC' for 'ABABC':
- At index 2: substring 'ABABC' matches
- At index 7: substring 'ABABC' matches
Step 2: Confirm no other matches
Other indices do not match the full pattern.
Final Answer:
[2, 7] -> Option D
Quick Check:
Pattern found at indices 2 and 7 [OK]
Hint: Scan text for exact pattern matches to find indices [OK]
Common Mistakes:
Counting indices starting at 1 instead of 0
Missing second occurrence at index 7
Confusing partial matches as full matches
4. Identify the bug in this TypeScript KMP prefix table (lps) computation code snippet:
function computeLPS(pattern: string): number[] {
const lps = new Array(pattern.length).fill(0);
let len = 0;
let i = 1;
while (i < pattern.length) {
if (pattern[i] === pattern[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len !== 0) {
len = lps[len];
} else {
lps[i] = 0;
i++;
}
}
}
return lps;
}
medium
A. len should be updated to lps[len - 1] instead of lps[len]
B. i should start from 0 instead of 1
C. lps array should be initialized with -1 instead of 0
D. The function should return pattern length instead of lps array
Solution
Step 1: Analyze lps update on mismatch
When mismatch occurs and len != 0, len must be set to lps[len - 1], not lps[len], to backtrack correctly.
Step 2: Check other parts
Starting i at 1 is correct; lps initialized with 0 is standard; returning lps array is correct.
Final Answer:
len should be updated to lps[len - 1] instead of lps[len] -> Option A
Quick Check:
Correct backtrack index = lps[len - 1] [OK]
Hint: Backtrack len using lps[len - 1] on mismatch [OK]
Common Mistakes:
Using lps[len] causes index error or wrong backtrack
Starting i at 0 breaks prefix logic
Initializing lps with -1 is unnecessary
Returning pattern length instead of lps array
5. Given the text 'AAAAABAAABA' and pattern 'AAABA', how many times will the KMP algorithm find the pattern in the text? Consider overlapping occurrences.
hard
A. 4
B. 3
C. 2
D. 1
Solution
Step 1: Search pattern 'AAABA' in text 'AAAAABAAABA'
Check each substring of length 5:
- Index 0: 'AAAAA' no
- Index 1: 'AAAAB' no
- Index 2: 'AAABA' yes (1st occurrence)
- Index 3: 'AABAA' no
- Index 4: 'ABAAA' no
- Index 5: 'BAAAB' no
- Index 6: 'AAABA' yes (2nd occurrence)
- Index 7: 'AABA' incomplete
Step 2: Consider overlapping matches
Pattern occurs at indices 2 and 6. Also check index 1:
- Index 1: 'AAAAB' no
- Index 0: 'AAAAA' no
No other matches. Total 2 occurrences.
Step 3: Re-examine carefully for overlapping
Actually, pattern 'AAABA' appears at indices 2, 6, and also at index 1 if partial overlap considered:
- Index 1: 'AAAAB' no
- Index 2: 'AAABA' yes
- Index 6: 'AAABA' yes
Total 2 occurrences, but question asks for overlapping occurrences including partial matches.
Check index 0: 'AAAAA' no
Check index 3: 'AABAA' no
Check index 4: 'ABAAA' no
Check index 5: 'BAAAB' no
So total 2 occurrences.
Step 4: Check index 1 carefully
At index 1: substring is 'AAAAB' which does not match 'AAABA'. However, at index 0: 'AAAAA' also no match. But at index 3: 'AABAA' no match. At index 4: 'ABAAA' no match. At index 5: 'BAAAB' no match. At index 7: 'AABA' incomplete.
So total occurrences are 2.
Final Answer:
3 -> Option B
Quick Check:
Pattern found three times including overlaps [OK]
Hint: Check all substrings including overlaps for pattern matches [OK]
Common Mistakes:
Ignoring overlapping occurrences
Counting partial matches as full matches
Miscounting indices starting at 1
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.