Palindromes and center expansion
Given the string "mominaracecar", let’s walk through the center expansion algorithm step by step.
The String
Index: 0 1 2 3 4 5 6 7 8 9 10 11 12
Char: m o m i n a r a c e c a r
For each index, we treat it as the center of a potential palindrome and expand outward. We check two cases per center:
- Odd-length: single character center —
expand(i, i) - Even-length: two character center —
expand(i, i+1)
i = 1 — Center: 'o' (Odd)
Start with l = 1, r = 1:
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef center fill:#FFD700,stroke:#555,color:#000
class b1 center
s[0]='m' == s[2]='m' ✓ → expand to l = 0, r = 2:
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef center fill:#FFD700,stroke:#555,color:#000
classDef match fill:#90EE90,stroke:#555,color:#000
class b1 center
class b0,b2 match
l = -1 → out of bounds, stop. Returns (0, 2), length = 3 → update start=0, max_len=3 → "mom"
i = 2 through i = 5
Centers 'm', 'i', 'n', 'a' — no adjacent matches in either direction. All yield length 1, no updates.
i = 6 — Center: 'r' (Odd)
Start with l = 6, r = 6:
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef center fill:#FFD700,stroke:#555,color:#000
class b6 center
s[5]='a' == s[7]='a' ✓ → expand to l = 5, r = 7:
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef center fill:#FFD700,stroke:#555,color:#000
classDef match fill:#90EE90,stroke:#555,color:#000
class b6 center
class b5,b7 match
s[4]='n' != s[8]='c' ✗ → stop. Returns (5, 7), length = 3 → no update (ties don’t replace) → "ara"
i = 9 — Center: 'e' (Odd)
Start with l = 9, r = 9:
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef center fill:#FFD700,stroke:#555,color:#000
class b9 center
s[8]='c' == s[10]='c' ✓ → expand to l = 8, r = 10:
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef center fill:#FFD700,stroke:#555,color:#000
classDef match fill:#90EE90,stroke:#555,color:#000
class b9 center
class b8,b10 match
s[7]='a' == s[11]='a' ✓ → expand to l = 7, r = 11:
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef center fill:#FFD700,stroke:#555,color:#000
classDef match fill:#90EE90,stroke:#555,color:#000
class b9 center
class b7,b8,b10,b11 match
s[6]='r' == s[12]='r' ✓ → expand to l = 6, r = 12:
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef center fill:#FFD700,stroke:#555,color:#000
classDef match fill:#90EE90,stroke:#555,color:#000
class b9 center
class b6,b7,b8,b10,b11,b12 match
r = 13 → out of bounds, stop. Returns (6, 12), length = 7 → update start=6, max_len=7 → "racecar"
Result
block-beta
columns 13
b0["m"] b1["o"] b2["m"] b3["i"] b4["n"] b5["a"] b6["r"] b7["a"] b8["c"] b9["e"] b10["c"] b11["a"] b12["r"]
classDef result fill:#90EE90,stroke:#555,color:#000
classDef dim fill:#ddd,stroke:#aaa,color:#999
class b6,b7,b8,b9,b10,b11,b12 result
class b0,b1,b2,b3,b4,b5 dim
"racecar" — longest palindromic substring, length 7.