3.8.9 · HinglishString Algorithms

Palindrome algorithms — Manacher's algorithm

2,127 words10 min readRead in English

3.8.9 · Coding › String Algorithms


KYA problem solve kar rahe hain?

KYO # trick (transformation)

Agar t ki length hai, toh hum ek array compute karte hain = t[i] par centered longest palindrome ka radius (radius = t mein har side par characters ki sankhya).


KAISE: core recurrence (derive karo)

Hum ko left se right sweep karte hain aur ab tak mila sabse rightmost-reaching palindrome maintain karte hain, jise uske center aur right boundary se describe kiya jaata hai (toh yeh cover karta hai, matlab half-length ).

KYO — do cases (dono ko steel-man karo)

Isliye hum lete hain: mirror par trust karo, lekin wall ke aage kabhi trust mat karo.

Figure — Palindrome algorithms — Manacher's algorithm

Reference implementation

def manacher(s):
    t = '#' + '#'.join(s) + '#'        # length 2n+1
    m = len(t)
    P = [0]*m
    C = R = 0
    for i in range(m):
        if i < R:
            P[i] = min(P[2*C - i], R - i)   # mirror, capped at wall
        # expand
        while i - P[i] - 1 >= 0 and i + P[i] + 1 < m and \
              t[i - P[i] - 1] == t[i + P[i] + 1]:
            P[i] += 1
        # update rightmost
        if i + P[i] > R:
            C, R = i, i + P[i]
    return P   # P[i] = palindrome length in ORIGINAL s centered at t[i]
 
# longest palindromic substring:
def longest_pal(s):
    P = manacher(s)
    k = max(range(len(P)), key=lambda i: P[i])
    start = (k - P[k]) // 2          # map t-index back to s-index
    return s[start:start + P[k]]

Worked examples


Common mistakes


Recall Feynman: ek 12-saal ke bachche ko explain karo

Ek row of mirror tiles ki imagine karo jahan beech mein ek magic mirror hai. Agar tumhe pehle se pata hai ki left side right side ko perfectly reflect karti hai, toh kisi jagah kya hai yeh jaanne ke liye, tum firse measure karne ke bajay uske mirror buddy ko dekh sakte ho. Tum real measuring sirf bilkul edge par karte ho jahan mirror ka reflection khatam ho jaata hai. Kyunki woh edge sirf aage move karti hai, tum kabhi same ground ko dobara measure nahi karte — isliye poora kaam fast hai. # symbols sirf spacers hain jo hum sprinkle karte hain taaki "even-length" mirrors aur "odd-length" mirrors ek jaisi shape ban jayein aur hume sirf ek tarah se deal karna pade.


Flashcards

s ko #a#b#...# mein kyun transform karte hain?
Yeh naye string mein har palindrome ko odd-length banne par force karta hai, odd/even cases ko unify karta hai (center hamesha ek position hoti hai).
kya store karta hai, aur yeh original string se kaise relate karta hai?
Transformed t mein radius; numerically original s mein corresponding palindrome ki length ke barabar hai.
center ke baare mein ka mirror index kya hai?
.
ke liye Manacher initialization state karo.
, phir expand karo.
ke saath kyun?
Symmetry sirf right wall tak guarantee karta hai; us se aage koi info nahi hai, isliye hum cap karte hain aur manually expand karte hain.
Tum kab expand NAHI karte?
Jab mirror palindrome strictly bade waale ke andar fit hota hai (): exactly hota hai.
Tum kab update karte ho?
Jab , set karo .
Manacher kyun hai?
Mirror copy hai; expansion sirf ko aage move karta hai, aur monotonically se tak badhta hai, toh total expansion hai.
Transformed center index ko s mein start index par map karo.
start = (k - P[k]) // 2.
t[i] par kitne palindromic substrings centered hain?
.

Connections

  • Longest Palindromic Substring (DP vs Manacher )
  • Expand Around Center (woh naive baseline jise Manacher accelerate karta hai)
  • Z-Algorithm & KMP failure function (dusre linear string preprocessing jo prior work ke reuse use karte hain)
  • Palindromic Tree (Eertree) (distinct palindromes count karne ka alternative)
  • Amortized Analysis (kyun monotone argument linear time deta hai)

Concept Map

enables reuse of

reduced by reuse to

achieves

solved by

builds string t of length 2n+1

radius equals length in s

reflect i across C

gives initial value

then

if reaches past R

feeds

yields

Palindrome symmetry

Mirror copy

Naive O of n squared

O of n

Odd even headache

Insert separator #

Array P i = radius

Real palindrome length

Track center C and right bound R

Mirror index i' = 2C - i

P i = min of P i' and R - i

Expand while chars match

Update C and R

Longest palindrome and count