What if you could find a needle in a haystack without digging through the whole pile again and again?
Why KMP Pattern Matching Algorithm in DSA C++?
Imagine you have a huge book and you want to find every place where a certain sentence appears. You start reading from the beginning each time you find a mismatch, going back and forth slowly.
This manual search is very slow and tiring because you keep re-reading parts of the book again and again. It wastes time and can easily cause mistakes if you lose track.
The KMP algorithm helps by remembering where to continue searching after a mismatch, so you never go back to the start. It uses a smart table to skip unnecessary checks and find the pattern quickly.
for (int i = 0; i <= text_length - pattern_length; i++) { int j = 0; while (j < pattern_length && text[i + j] == pattern[j]) { j++; } if (j == pattern_length) return i; }
int i = 0, j = 0; while (i < text_length) { if (text[i] == pattern[j]) { i++; j++; if (j == pattern_length) return i - j; } else if (j > 0) { j = lps[j - 1]; } else { i++; } }
KMP enables fast and efficient searching of patterns in large texts without unnecessary repetition.
Searching for a specific word or phrase in a large document or DNA sequence quickly and accurately.
KMP avoids re-checking characters by using a precomputed table.
It speeds up pattern searching in big texts.
It is more efficient than simple brute force search.
Practice
Solution
Step 1: Understand KMP's goal
KMP algorithm is designed to search for a pattern inside a text efficiently.Step 2: Identify how it works
It avoids rechecking characters by using a prefix table to skip unnecessary comparisons.Final Answer:
To find occurrences of a pattern in a text efficiently without rechecking characters -> Option AQuick Check:
KMP purpose = efficient pattern search [OK]
- Thinking KMP sorts or modifies the text
- Confusing KMP with simple substring search
- Assuming KMP counts characters or vowels
Solution
Step 1: Understand dynamic array allocation in C++
To create an array dynamically, use pointer with new keyword: int* lps = new int[size];Step 2: Check options
int* lps = new int[pattern_length]; correctly uses pointer and new to allocate array of given length.Final Answer:
int* lps = new int[pattern_length]; -> Option BQuick Check:
Dynamic array = int* lps = new int[size]; [OK]
- Using int lps = new int[] (wrong type)
- Declaring fixed size without initialization
- Incorrect array syntax like int lps[] = size
std::string text = "ababcabcabababd"; std::string pattern = "ababd"; std::vector<int> result = kmpSearch(text, pattern); for(int pos : result) std::cout << pos << " ";
Assuming
kmpSearch returns all starting indices of pattern in text.Solution
Step 1: Identify pattern occurrences in text
Check where "ababd" appears in "ababcabcabababd". It appears starting at index 10 only.Step 2: Confirm output format
kmpSearch returns vector of indices; printing them separated by space outputs "10 ".Final Answer:
10 -> Option AQuick Check:
Pattern found at index 10 only [OK]
- Assuming multiple matches without checking text
- Confusing substring indices
- Printing no output if pattern not found
void computeLPSArray(string pat, int M, int* lps) {
int len = 0;
lps[0] = 0;
int i = 1;
while (i < M) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len != 0) {
len = lps[len]; // Bug here
} else {
lps[i] = 0;
i++;
}
}
}
}What is the bug and how to fix it?
Solution
Step 1: Identify incorrect index in LPS update
When mismatch occurs and len != 0, len should be updated to lps[len-1], not lps[len].Step 2: Correct the assignment
Change len = lps[len]; to len = lps[len - 1]; to avoid out-of-bound and logical error.Final Answer:
Change len = lps[len]; to len = lps[len - 1]; -> Option DQuick Check:
LPS update uses len-1 index [OK]
- Using len index directly causes wrong LPS values
- Changing loop type unnecessarily
- Removing else block breaks logic
Solution
Step 1: Understand KMP's limitation
KMP efficiently finds one pattern in text but running it repeatedly for many patterns is inefficient.Step 2: Identify better multi-pattern method
Building a trie and using Aho-Corasick algorithm finds all patterns simultaneously efficiently.Final Answer:
Build a trie of patterns and run Aho-Corasick algorithm -> Option CQuick Check:
Multi-pattern search = Aho-Corasick [OK]
- Running KMP repeatedly wastes time
- Concatenating patterns confuses matching
- Ignoring specialized multi-pattern algorithms
Ready to prove it?
Pass the test and this pattern moves unknown
