Exercises — KMP algorithm — failure function, O(n+m) — full derivation
3.8.2 · D4· Coding › String Algorithms › KMP algorithm — failure function, O(n+m) — full derivation
Do machines ka reminder jo aap baar baar use karte rahenge:
"Border" ek short word hai uss string ke liye jo ek proper prefix bhi ho aur proper suffix bhi ho. Picture dekho: do shaded blocks equal hain, isliye string ababa ka ek border aba hai jiska length hai.

Level 1 — Recognition
L1.1 — Definition se ek value padho
Problem. ke liye, haath se compute karo (last position).
Recall Solution
. Hume longest border chahiye.
- Length 4 candidate
aabavs suffixabaa— nahi. - Length 3 candidate
aabvs suffixbaa— nahi. - Length 2 candidate
aavs suffixaa— haan.
Toh . (Length 1 a=a bhi kaam karta hai lekin 2 bada hai, toh hum 2 rakhte hain.)
L1.2 — Poora table bharo
Problem. ke liye poora array banao.
Recall Solution
Position by position chalo, hamesha woh longest prefix lo jo ka suffix bhi ho:
| i | S[0..i] | border | π[i] |
|---|---|---|---|
| 0 | a | — | 0 |
| 1 | aa | a |
1 |
| 2 | aab | — | 0 |
| 3 | aaba | a |
1 |
| 4 | aabaa | aa |
2 |
| 5 | aabaaa | aa |
2 |
| 6 | aabaaab | aab |
3 |
Toh .
dhyan se dekho: aabaaa — aaa? aisa koi prefix nahi; border aa hi rehta hai.
Level 2 — Application
L2.1 — Build machine chalao, apni aankhein nahi
Problem. Code use karo (intuition nahi) ke liye compute karne ke liye. Har step par dikhao.
Recall Solution
Build loop yaad karo: j=pi[i-1]; while j>0 and S[i]!=S[j]: j=pi[j-1]; if
S[i]==S[j]: j+=1; pi[i]=j.
| i | S[i] | start j | while-jumps | S[i]==S[j]? | π[i] |
|---|---|---|---|---|---|
| 1 | b | 0 | — | b≠a → nahi | 0 |
| 2 | a | 0 | — | a==a → +1 | 1 |
| 3 | c | 1 | S[3]=c≠S[1]=b → j=π[0]=0 | c≠a → nahi | 0 |
| 4 | a | 0 | — | a==a → +1 | 1 |
| 5 | b | 1 | S[5]=b==S[1]=b | haan → +1 | 2 |
| 6 | a | 2 | S[6]=a==S[2]=a | haan → +1 | 3 |
| 7 | b | 3 | S[7]=b==S[3]=c? nahi → j=π[2]=1; S[7]=b==S[1]=b | haan → +1 | 2 |
.
L2.2 — Match machine chalao
Problem. ke saath (toh ), mein saare occurrences dhundho. Start indices (0-based) list karo.
Recall Solution
Match loop ko aage badhata rehta hai, matched pattern chars count karta hai.
| i | T[i] | j before | action | j after |
|---|---|---|---|---|
| 0 | a | 0 | match | 1 |
| 1 | b | 1 | match | 2 |
| 2 | a | 2 | match → j=3=m, report 0, j=π[2]=1 | 1 |
| 3 | b | 1 | match | 2 |
| 4 | a | 2 | match → j=3=m, report 2, j=π[2]=1 | 1 |
Occurrences indices 0 aur 2 par start hote hain (overlapping — beech ka a share hota hai).
Level 3 — Analysis
L3.1 — Proper clause optional kyun nahi hai
Problem. Maano koi define karta hai poori string ko allow karte hue longest prefix=suffix ke roop mein. Match loop par trace karo jab pehla mismatch aata hai aur precisely failure explain karo.
Recall Solution
"Improved" definition ke saath, har position ko milta hai (poori
substring apna khud ka longest prefix-and-suffix hai).
Ab pattern index par mismatch aata hai. Fallback hai .
Matlab: change nahi hota. while j>0 and T[i]!=P[j] condition
abhi bhi true hai (same , same mismatch), toh hum frozen ke saath loop karte hain — ek
infinite loop. Proper clause exactly yahi guarantee karta hai ki ho, toh
har jump strictly ko shrink karta hai aur loop terminate karna padta hai.
L3.2 — Total fallback work count karna
Problem. (length ) mein (length ) match karne ke liye, ek tight upper
bound do ki match loop ka inner while body total kitni baar run ho sakta hai,
aur justify karo ki kaise change hota hai.
Recall Solution
Single variable ko poori run mein watch karo.
- sirf badhta hai
j+=1mein, ek baar per outer iteration, aur outer iterations hain → total increase . - Har
whilebody karta hai jahan hai, toh har body ko kam se kam 1 se decrease karta hai. - se shuru hota hai aur kabhi negative nahi hota, toh total decrease total increase .
Isliye while body poori match mein zyada se zyada baar run hoti hai, per character nahi. Yahi bound ka amortized heart hai. "Sawtooth" dekho: ek step at a time chadhta hai aur utna hi gir sakta hai jitna chadha tha.

Level 4 — Synthesis
L4.1 — Ek string ka smallest period
Problem. Ek string (length ) ka period sabse chhota hai jo ki satisfy kare sabhi valid ke liye. Prove karo ki smallest period hai, phir isse par apply karo.
Recall Solution
Border ⇔ period link. Agar ka length ka border hai, toh length ka prefix
length ke suffix ke barabar hai. Unhe overlay karne par milta hai
har jagah jo overlap karti hai — toh ek period hai. Ulta, ek period se
length ka border milta hai. Toh longest border ⇔ smallest period, aur
Apply karo. , . Iska hai , toh
. Phir . Sach mein ababab block ab ko repeat karta hai jiska
length hai. ✓
L4.2 — Kya kisi chhote block ki repetition hai?
Problem. " kisi block ki copies hai" ke liye ek one-line test do ( use karke),
aur isse abcabcabc aur abcab par test karo.
Recall Solution
kisi block ki full copies hai agar aur sirf agar iska smallest period ko divide kare aur ho. Tab .
abcabcabc: , , toh . aur → haan,abcki copies. ✓abcab: , , toh . → clean repetition nahi. ✓
Level 5 — Mastery
L5.1 — KMP se longest palindromic prefix
Problem. diya gaya hai, hume iska longest prefix chahiye jo palindrome ho. Dikhao ki isse EK prefix-function computation se kaise nikala jaaye, aur isse par run karo. (Hint: reverse aur ek separator.)
Recall Solution
= ka reverse, aur banao , jahan # ek aisa
character hai jo mein kaheen nahi aata. par compute karo.
Kyun kaam karta hai: = ka longest prefix jo
ka suffix bhi ho. ka suffix (ulta karke) ka prefix backwards padha hai;
isse ke prefix se match karna us prefix ko forwards aur backwards same padhne par majboor karta hai — ek palindromic prefix. # border ko beech se cross karne se rokta hai, toh value se zyada nahi ho sakti.
Run karo. , ,
(length 13). par compute karte hain, last value
hai, prefix aba match karta hai. Toh abacab ka longest palindromic prefix
length 3 ka hai (aba). ✓
L5.2 — Distinct border lengths count karo
Problem. ke saare border lengths ka set (saare proper prefixes jo suffix bhi hain) exactly hai, tak. use karke (L1.2 se, ), poori string ke saare border lengths list karo.
Recall Solution
Last index se shuru karo: . Phir ke through chain chase karo:
- length → next .
- length → ruko.
Toh border lengths hain ; trivial empty border ko ignore karke, aabaaab ka sirf ek
non-trivial border hai jiska length 3 hai (block aab). -chain ko tail se chase karna
har border ko enumerate karta hai, longest pehle, borders ki sankhya ke proportional time mein.
Recall Aage kahan jaana hai
- Wahi border/period ideas Borders and Periods of Strings ko power karte hain.
- Z-values par build ek alag linear-matcher: Z-algorithm.
- Hashing-based matching (alag trade-offs): Rabin-Karp.
- Ek saath kai patterns: Aho-Corasick; heavy string machinery: Suffix Automaton, Suffix Array.
- L3.2 mein amortized argument Amortized Analysis ka ek case study hai.
Active Recall
Longest border of aabaaab?
aab)