function longestPalindrome(s: string): string {
let start = 0, maxLen = 1;
function expand(left: number, right: number): void {
while (left >= 0 && right < s.length && s[left] === s[right]) {
if (right - left + 1 > maxLen) {
maxLen = right - left + 1;
start = left;
}
left--;
right++;
}
}
for (let i = 0; i < s.length; i++) {
expand(i, i); // odd-length centers
expand(i, i + 1); // even-length centers
}
return s.substring(start, start + maxLen);
}Trace on s='babad': i=0: expand(0,0)='b' len=1. expand(0,1): s[0]='b'≠s[1]='a', stop. i=1: expand(1,1): s[0]=s[2]='b' → 'bab' len=3, start=0. expand more: out of bounds. expand(1,2): s[1]='a'≠s[2]='b', stop. i=2: expand(2,2): s[1]=s[3]='a' → 'aba' len=3 (not > 3, no update). expand(2,2) more: s[0]='b'≠s[4]='d', stop. expand(2,3): s[2]='b'≠s[3]='a', stop. i=3,4: no longer palindromes found. Return s.substring(0,3)='bab'.