3.8.9 · D1 · Coding › String Algorithms › Palindrome algorithms — Manacher's algorithm
Ek palindrome aage se padhne par aur peeche se padhne par same hota hai, matlab yeh apne center ke baare mein ek mirror hai. Agar aap pehle se jaante hain ki ek bada mirror-region exist karta hai, toh us region ke andar har point ka ek twin dusri taraf hota hai — toh dobara measure karne ki jagah, aap apne twin ka answer copy karte hain aur fresh work sirf frontier pe karte hain.
Yeh page assume karta hai ki aapne kuch bhi nahi dekha. Hum har letter, bracket, aur idea ko build karte hain jis par parent note (Palindrome algorithms — Manacher's algorithm (index 3.8.9) ) rely karta hai, un ke dependency order mein. End tak aap us note ki har line bina ruke padh sakte hain.
Definition String aur index
Ek string characters ki ek row hoti hai jo left se right likhi jaati hai, jaise boxes ki ek row jisme har box mein ek letter hota hai. Hum ise s kehte hain. Length n yeh batata hai ki kitne boxes hain. Har box ka ek index hota hai — ek house number — jo 0 se start hota hai.
s = a b b a , n = 4
Toh s [ 0 ] = a , s [ 1 ] = b , s [ 2 ] = b , s [ 3 ] = a .
Intuition Count 0 se kyun start karte hain?
Kyunki "index" ka matlab hai "mere left mein kitne boxes hain." Pehle box ke left mein zero boxes hain, toh woh box 0 hai. Yeh koi quirk nahi hai — yeh baad ki arithmetic (mirroring, mapping back) ko clean rakhta hai.
Yeh topic ko kyun chahiye? Har baad ka idea — center, radius, mirror — ek statement about indices hai. Agar indices shaky hain, toh unke upar kuch bhi khada nahi rahega.
Ek string ek palindrome hai agar use left-to-right padhne par wahi cheez milti hai jo right-to-left padhne par milti hai. aba, abba, racecar, aur ek single letter x sab palindromes hain. ab nahi hai.
Jo picture important hai woh hai ek center line ke baare mein symmetry : string ko aadha fold karo aur dono halves exactly ek doosre ke upar land karti hain.
Intuition Center ke do flavours
Odd length (aba): fold line ek character par land karti hai — beech wala b. Ek saccha center box exist karta hai.
Even length (abba): fold line do characters ke beech land karti hai — dono bs ke beech mein. Koi single center box nahi hota.
Yahi split woh poora reason hai jis wajah se parent note baad mein # trick introduce karta hai: yeh dono flavours ko ek real center box dene par majboor karta hai.
Topic ko yeh kyun chahiye: poora algorithm hai "har possible center ke liye, mirror kitni door tak hold karta hai?" Aapko pehle crystal clear hona chahiye ki center kya hota hai aur uske do kinds hote hain.
Definition Center aur radius
Ek center pick karo. Radius woh hai ki center ke har side mein kitne characters hain jo abhi bhi palindrome form karte hain. Agar aap r steps left aur r steps right ja sakte hain aur woh abhi bhi match karta hai, toh radius r hai.
aba centered on b: radius 1 (ek a har side mein).
x akela: radius 0 .
Topic ko yeh kyun chahiye: algorithm jo array build karta hai, P [ i ] , exactly "center i par radius" hai. Radius woh quantity hai jo twins ke beech cleanly mirror hoti hai — length nahi karti.
t
Har pair of characters ke beech # insert karo, aur ek start mein aur end mein:
abba → t = #a#b#b#a#
Ab t ki length m = 2 n + 1 hai (ek original char plus usse pehle ek #, plus ek final #).
Intuition Yeh even/odd headache kyun fix karta hai
t mein, characters aur # strictly alternate karte hain. Yeh force karta hai ki t mein har palindrome ki length odd ho — uska center hamesha t ka ek single box hota hai. s ka ek even palindrome (jaise bb) ab dono bs ke beech wale # par centered hota hai. Toh reason karne ke liye sirf ek hi tarah ka center hota hai.
Topic ko yeh kyun chahiye: yeh do messy cases ko ek uniform loop mein convert karta hai. Yeh reference code mein sabse zyada reuse hone wala idea hai (t = '#' + '#'.join(s) + '#').
Definition Reflection formula
Index C par ek center aur index i par ek point given hai, C ke across i ka mirror (twin) hai
i ′ = 2 C − i
Ise aise padho: i ′ C ke left mein utna hi door hai jitna i right mein hai (ya vice versa).
2 C − i kahan se aata hai
C se i tak ki distance ( i − C ) hai. Doosri taraf same distance jaao: C − ( i − C ) = 2 C − i . Formula bas itna hi hai — "same distance, opposite side."
Topic ko yeh kyun chahiye: symmetry ka matlab hai "point i apne twin i ′ jaisa dikhta hai." Twin ke already-computed radius ko copy karne ke liye, aapko jaanna hoga ki twin kaunsa index hai . Woh index 2 C − i hai.
Definition Current rightmost palindrome
Jab algorithm left se right sweep karta hai, woh ek known palindrome yaad rakhta hai jo sabse door right tak pahunchta hai, jo store hota hai as:
C — uska center index,
R — uski right boundary (index just past its rightmost character, ya uska rightmost, depending on convention; parent R = i + P [ i ] use karta hai).
R − i tab hai "known palindrome ke kitne boxes current point i ke right mein abhi bhi hain" — matlab symmetry guarantee kitni door tak abhi bhi pahunchti hai.
Intuition "Rightmost" kyun aur "biggest" kyun nahi?
Kyunki sweep rightward move karta hai, woh palindrome jis ka right edge sabse aage tak pahunchta hai, woh most likely woh hai jo next point i ko contain karta hai. Containment hi woh cheez hai jo aapko twin copy karne deta hai. Uski size irrelevant hai; uski reach sab kuch hai.
Topic ko yeh kyun chahiye: min(P[2C-i], R-i) — algorithm ka dil — dono R (wall) aur C (twin dhundhne ke liye) use karta hai. C , R nahi, toh reuse nahi, toh linear time nahi.
min ( a , b ) do numbers mein se chota choose karta hai. Bas itna hi.
min yahan sahi tool kyun hai
Twin ka radius P [ i ′ ] ek promise hai — "kam se kam itni door tak, mera tumhara match karta hai." Lekin woh promise sirf known window ke andar hi trustworthy hai; wall R ke baad hume zero information hai. Toh hum in dono mein se chota lete hain:
jo twin promise karta hai, P [ i ′ ] , aur
wall kitni door hai, R − i .
Hum wall ke baad kabhi claim nahi karte, lekin us tak trust zaroor karte hain. Yahi exactly woh hai jo min(P[i'], R-i) kehta hai.
Topic ko yeh kyun chahiye: yeh single min hi woh cheez hai jo initial guess ko fresh count ki jagah O ( 1 ) banata hai.
Intuition Wall ki travel se work count karna
min guess ke baad, algorithm wall ke past expand karne ki koshish karta hai, ek character ek time. Har successful expansion step R ko ek box aur right push karta hai. Lekin R 0 se start karta hai aur sirf increase hota hai, at most m = 2 n + 1 tak. Toh poore run mein , expansion at most m baar total hoti hai — har index ke liye nahi.
Us cost ko sab n steps par average karne se O ( 1 ) each milta hai: yeh Amortized Analysis hai.
Topic ko yeh kyun chahiye: yeh poora "O ( n ) " ka justification hai. Iske bina aap nahi bata sakte ki Manacher kyun Expand Around Center ke O ( n 2 ) worst case ko beat karta hai.
string s and index from 0
palindrome = symmetry about a center
hash transform to t makes all odd
radius array P equals length in s
mirror index i prime = 2C minus i
window C and R the known reach
min of twin and wall gives cheap guess
expand past wall pushes R right
Related destinations jab aap ready hon: Longest Palindromic Substring , Expand Around Center , aur cousins jo same "copy from a known prefix" trick reuse karte hain — Z-Algorithm , KMP failure function , aur Palindromic Tree (Eertree) .
Kya aap s = "abcd" ke liye s[2] ki value aur n bata sakte hain? s [ 2 ] = c aur n = 4 .
abba odd- ya even-length palindrome hai, aur uska center kahan hai?Even; center dono bs ke beech mein hai (koi single center box nahi).
racecar palindrome ka apne center e ke baare mein radius kya hai?Radius 3 (har side mein rac); length = 2 ⋅ 3 + 1 = 7 .
abc ko # trick se transform karo.#a#b#c# (length m = 2 ⋅ 3 + 1 = 7 ).
Agar t mein ek center ka radius P [ i ] = 4 hai, toh s mein palindrome kitni lambi hai? Length 4 (radius in t equals length in s ).
Center C = 5 , current point i = 8 . Mirror index i ′ kya hai? i ′ = 2 ⋅ 5 − 8 = 2 .
Window mein R = 9 hai, aur aap i = 6 par hain; twin P [ i ′ ] = 5 promise karta hai. Aap kaunsa initial radius lete hain? min ( 5 , R − i ) = min ( 5 , 3 ) = 3 — wall par capped.
Manacher O ( n ) kyun hai aur O ( n 2 ) kyun nahi? Kyunki expansion sirf R ko rightward push karti hai, aur R poore total mein at most m baar move karta hai (amortized linear).