647. 回文子串 - 力扣(LeetCode)

图示

代码

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/

相关推荐
:-)9 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry13 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发14 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星14 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮14 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home840714 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>15 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC16 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC16 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师16 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法