What does KMP stand for in the KMP Pattern Matching Algorithm?
KMP stands for Knuth-Morris-Pratt, the last names of the three computer scientists who developed this efficient pattern matching algorithm.
Click to reveal answer
beginner
What is the main advantage of the KMP algorithm over the naive pattern matching approach?
KMP avoids rechecking characters that have already been matched by using a precomputed 'Longest Prefix Suffix' (LPS) array, making it faster especially for large texts and patterns.
Click to reveal answer
intermediate
What is the purpose of the LPS (Longest Prefix Suffix) array in KMP?
The LPS array stores the length of the longest proper prefix of the pattern that is also a suffix for every prefix of the pattern. It helps to decide where to continue matching after a mismatch.
Click to reveal answer
intermediate
In KMP, what happens when a mismatch occurs after some characters have matched?
Instead of restarting from the next character in the text, KMP uses the LPS array to shift the pattern to the right position, skipping unnecessary comparisons.
Click to reveal answer
intermediate
What is the time complexity of the KMP Pattern Matching Algorithm?
The time complexity is O(n + m), where n is the length of the text and m is the length of the pattern, because each character is processed at most twice.
Click to reveal answer
What does the LPS array represent in the KMP algorithm?
ALength of the longest substring in the text
BLength of the longest prefix which is also a suffix for pattern prefixes
CNumber of mismatches found so far
DPositions of pattern matches in the text
✗ Incorrect
The LPS array stores the length of the longest proper prefix which is also a suffix for each prefix of the pattern.
Why does KMP algorithm not backtrack in the text after a mismatch?
ABecause it compares all characters again
BBecause it restarts matching from the beginning of the text
CBecause it uses the LPS array to skip unnecessary comparisons
DBecause it uses random access to jump to matches
✗ Incorrect
KMP uses the LPS array to know how far to shift the pattern, avoiding backtracking in the text.
What is the worst-case time complexity of the KMP algorithm?
AO(n + m)
BO(n * m)
CO(n^2)
DO(m^2)
✗ Incorrect
KMP runs in linear time relative to the sum of the text and pattern lengths, O(n + m).
Which step is done first in the KMP algorithm?
ABuilding the LPS array for the pattern
BSearching the pattern in the text
CComparing characters in the text
DReturning the match positions
✗ Incorrect
KMP first builds the LPS array to prepare for efficient searching.
If the pattern is 'ABABC', what is the LPS value for the last character 'C'?
A2
B1
C3
D0
✗ Incorrect
For 'ABABC', the longest prefix which is also suffix for the full pattern is 0 because no proper prefix equals suffix ending at 'C'.
Explain how the LPS array is constructed in the KMP algorithm and why it is important.
Think about matching prefixes and suffixes within the pattern itself.
You got /3 concepts.
Describe the process of pattern searching in the text using the KMP algorithm after the LPS array is ready.
Focus on how the algorithm moves through the text and pattern without backtracking.
You got /4 concepts.
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.