图示

代码
python
# encoding = utf-8
# 开发者:Alen
# 开发时间: 15:08
# "Stay hungry,stay foolish."
class Solution(object):
def countSubstrings(self, s):
"""
:type s: str
:rtype: int
"""
# 1. 预处理字符串,例如 "abc" 变成 "^#a#b#c#$"
# 加入 ^ 和 $ 是为了防止越界处理,不需要写额外的边界判断
t = "^#" + "#".join(s) + "#$"
n = len(t)
# p 数组记录以每个字符为中心的回文半径
p = [0] * n
center = right = 0
count = 0
for i in range(1, n - 1):
# i_mirror 是 i 关于 center 的对称点
i_mirror = 2 * center - i # center - i_mirror = i - center
# 核心优化:如果 i 在 right 边界内,利用对称性快速初始化回文半径
if right > i:
p[i] = min(right - i, p[i_mirror])
# 中心扩展(尝试扩大回文半径)
while t[i + 1 + p[i]] == t[i - 1 - p[i]]:
p[i] += 1
# 如果扩展后的右边界超过了当前的 right,则更新中心和右边界
if i + p[i] > right:
center = i
right = i + p[i]
# 记录回文串数量
# 原字符串中以该点为中心的回文串数量等于其半径除以 2(向上取整)
# 由于 p[i] 记录的是加了 # 后的半径,(p[i] + 1) // 2 正好等于回文子串个数
count += (p[i] + 1) // 2
return count
结果
解题步骤:https://www.bilibili.com/video/BV1mV9TBNEf3/
