What if you could find a phrase in a huge book without ever rereading the same page twice?
Why KMP Pattern Matching Algorithm in DSA Python?
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 because you waste time rechecking letters you already know don't match. It's like reading the same pages over and over, which is tiring and frustrating.
The KMP algorithm cleverly remembers where to restart the search without going back to the start. It uses a helper table to skip unnecessary checks, making the search much faster and smoother.
def search(text, pattern): for i in range(len(text) - len(pattern) + 1): j = 0 while j < len(pattern) and text[i + j] == pattern[j]: j += 1 if j == len(pattern): print('Found at', i)
def kmp_search(text, pattern): lps = compute_lps(pattern) i = j = 0 while i < len(text): if text[i] == pattern[j]: i += 1 j += 1 if j == len(pattern): print('Found at', i - j) j = lps[j - 1] else: if j != 0: j = lps[j - 1] else: i += 1
KMP enables lightning-fast pattern searches in large texts without wasting time on repeated checks.
Search engines use KMP-like algorithms to quickly find your search words inside billions of web pages instantly.
Manual search repeats checks and is slow.
KMP uses a helper table to skip unnecessary comparisons.
This makes pattern searching efficient and fast.
Practice
Solution
Step 1: Understand the goal of KMP algorithm
KMP is designed to search for a pattern inside a larger text efficiently without rechecking characters unnecessarily.Step 2: Compare with other options
Sorting, reversing strings, and factorial calculations are unrelated to pattern searching.Final Answer:
To find occurrences of a pattern string within a text efficiently -> Option DQuick Check:
KMP = Pattern search [OK]
- Confusing KMP with sorting algorithms
- Thinking KMP reverses strings
- Assuming KMP calculates mathematical functions
Solution
Step 1: Understand the prefix table initialization
The prefix table (lps array) stores lengths of longest proper prefix which is also suffix for each prefix of the pattern. It must be initialized with zeros for all positions.Step 2: Check each option
lps = [0] * len(pattern) correctly initializes lps with zeros for the entire pattern length. lps = [] is empty list, which is incomplete. lps = [1] * len(pattern) initializes with ones, which is incorrect. lps = None sets None, which is invalid.Final Answer:
lps = [0] * len(pattern) -> Option AQuick Check:
Prefix table starts with zeros [OK]
- Initializing lps with ones instead of zeros
- Leaving lps empty
- Assigning None to lps
def compute_lps(pattern):
lps = [0] * len(pattern)
length = 0
i = 1
while i < len(pattern):
if pattern[i] == pattern[length]:
length += 1
lps[i] = length
i += 1
else:
if length != 0:
length = lps[length - 1]
else:
lps[i] = 0
i += 1
return lps
pattern = "ABABC"
lps = compute_lps(pattern)
print(lps)Solution
Step 1: Compute lps array for pattern "ABABC"
Index 0: lps[0] = 0 (always zero)
Index 1: pattern[1] = 'B' != pattern[0] = 'A', lps[1] = 0
Index 2: pattern[2] = 'A' == pattern[0] = 'A', lps[2] = 1
Index 3: pattern[3] = 'B' == pattern[1] = 'B', lps[3] = 2
Index 4: pattern[4] = 'C' != pattern[2] = 'A', lps[4] = 0Step 2: Final lps array
The computed lps array is [0, 0, 1, 2, 0].Final Answer:
[0, 0, 1, 2, 0] -> Option BQuick Check:
lps for "ABABC" = [0,0,1,2,0] [OK]
- Confusing lps values with pattern indices
- Assuming all zeros or all increasing values
- Mixing up characters when comparing
def compute_lps(pattern):
lps = [0] * len(pattern)
length = 0
i = 0
while i < len(pattern):
if pattern[i] == pattern[length]:
length += 1
lps[i] = length
i += 1
else:
if length != 0:
length = lps[length - 1]
else:
lps[i] = 0
i += 1
return lpsSolution
Step 1: Analyze the loop initialization
In KMP prefix table computation, the first character's lps is always zero and we start comparing from the second character, so i should start at 1.Step 2: Check the given code
The code starts with i = 0, which causes comparing pattern[0] with pattern[0] immediately, leading to incorrect lps values and infinite loop risk.Final Answer:
The loop should start with i = 1, not i = 0 -> Option AQuick Check:
Start i at 1 for prefix table [OK]
- Starting loop at zero causing wrong comparisons
- Initializing lps with ones instead of zeros
- Returning wrong variable
"ABABDABACDABABCABAB" and pattern "ABABCABAB", how many times does the pattern appear in the text using KMP algorithm?Solution
Step 1: Understand the pattern and text
The pattern "ABABCABAB" is searched inside the text "ABABDABACDABABCABAB" using KMP which efficiently finds all occurrences.Step 2: Identify pattern occurrences
By scanning the text:
- Occurrence starts at index 10 (substring "ABABCABAB")
So pattern appears 1 time.Final Answer:
1 -> Option CQuick Check:
Pattern appears once in text [OK]
- Counting only first occurrence
- Ignoring overlapping matches
- Misreading pattern or text
Ready to prove it?
Pass the test and this pattern moves unknown
