Palindromic Substrings

MediumTwo PointersStringDynamic Programming

Solution

export function countSubstrings(s: string): number {
  function manachers(str: string) {
    const s = `#${[...str].join('#')}#`;
 
    const n = s.length;
    const p = new Array<number>(n).fill(0);
 
    let [center, right] = [0, 0];
    for (let i = 0; i < n; i++) {
      p[i] = right >= i ? Math.min(right - i, p[2 * center - i]) : 0;
 
      while (i + p[i] + 1 < n && 0 <= i - p[i] - 1 && s[i + p[i] + 1] === s[i - p[i] - 1]) {
        p[i] += 1;
      }
 
      if (right < i + p[i]) {
        right = i + p[i];
        center = i;
      }
    }
    return p;
  }
 
  return manachers(s).reduce((acc, v) => acc + Math.floor((v + 1) / 2), 0);
}