Discover how to find hidden patterns instantly without re-reading the same text!
Why KMP Pattern Matching Algorithm in DSA Typescript?
Imagine you have a huge book and you want to find every place where a certain phrase appears. You start reading from the beginning each time you find a mismatch, going back and forth repeatedly.
This manual search is very slow and tiring because you keep rechecking the same letters again and again. It wastes time and can easily cause mistakes if you lose track.
The KMP algorithm smartly remembers what parts of the phrase matched before and uses that knowledge to skip unnecessary checks. This way, it quickly finds all matches without going back.
function search(text: string, pattern: string): number[] {
let results = [];
for (let i = 0; i <= text.length - pattern.length; i++) {
let j = 0;
while (j < pattern.length && text[i + j] === pattern[j]) {
j++;
}
if (j === pattern.length) results.push(i);
}
return results;
}function kmpSearch(text: string, pattern: string): number[] {
const lps = computeLPSArray(pattern);
let results = [];
let i = 0, j = 0;
while (i < text.length) {
if (pattern[j] === text[i]) {
i++; j++;
if (j === pattern.length) {
results.push(i - j);
j = lps[j - 1];
}
} else if (j !== 0) {
j = lps[j - 1];
} else {
i++;
}
}
return results;
}It enables lightning-fast searching of patterns in large texts without wasting time on repeated checks.
Search engines use KMP to quickly find your search words inside billions of web pages, making results appear instantly.
KMP avoids rechecking characters by using a precomputed table.
This makes pattern searching much faster than simple brute force.
It is essential for efficient text processing and search tasks.
Practice
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 AQuick Check:
KMP purpose = efficient pattern search [OK]
- Confusing KMP with sorting algorithms
- Thinking KMP reverses strings
- Assuming KMP finds max elements
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 CQuick Check:
Array init with zeros = const lps: number[] = new Array(pattern.length).fill(0); [OK]
- Using parentheses instead of property for length
- Not filling array with zeros
- Passing string instead of length to Array constructor
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);
Solution
Step 1: Identify pattern occurrences in text
Check text 'ABABABCABABC' for 'ABABC': - At index 2: substring 'ABABC' matches - At index 7: substring 'ABABC' matchesStep 2: Confirm no other matches
Other indices do not match the full pattern.Final Answer:
[2, 7] -> Option DQuick Check:
Pattern found at indices 2 and 7 [OK]
- Counting indices starting at 1 instead of 0
- Missing second occurrence at index 7
- Confusing partial matches as full matches
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;
}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 AQuick Check:
Correct backtrack index = lps[len - 1] [OK]
- 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
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' incompleteStep 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 BQuick Check:
Pattern found three times including overlaps [OK]
- Ignoring overlapping occurrences
- Counting partial matches as full matches
- Miscounting indices starting at 1
Ready to prove it?
Pass the test and this pattern moves unknown
