当前位置: 首页 > news >正文

LeetCode - 647. 回文子串

目录

题目

思路

步骤

字符串: "abcba"

中心点 i=0 (字符 'a')

中心点 i=1 (字符 'b')

中心点 i=2 (字符 'c')

中心点 i=3 (字符 'b')

中心点 i=4 (字符 'a')

总结计算

时间和空间复杂度


题目

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

思路

中心扩展算法是寻找回文串的一种直观方法,基于以下观察:

  • 每个回文串都有一个"中心"
  • 从中心向两边扩展,如果两边字符相同,则形成更长的回文串

回文串的两种类型

奇数长度回文串:中心是单个字符

  • 例如:"aba" 中心是 'b'
  • 扩展过程:'b' → 'aba'

偶数长度回文串:中心是两个相邻字符之间的位置

  • 例如:"abba" 中心是 'b' 和 'b' 之间
  • 扩展过程:'bb' → 'abba'

步骤

遍历所有可能的中心点:

  • 对于长度为n的字符串,共有2n-1个可能的中心点
  • n个字符可以作为奇数长度回文串的中心
  • n-1个字符间隙可以作为偶数长度回文串的中心

对每个中心点,尝试扩展:

  • 从中心开始,向两边同时扩展
  • 只要两边的字符相同,就继续扩展
  • 每次成功扩展都找到一个新的回文子串

统计所有回文子串:

  • 对所有中心点扩展的结果求和

过程

字符串: "abcba"

中心点 i=0 (字符 'a')

奇数长度扩展 (left=0, right=0):

[a] b c b a^
  • 'a' 是回文串,count=1
  • 尝试扩展到 (-1,1),左侧越界,停止

偶数长度扩展 (left=0, right=1):

a [b] c b a
^ ^
  • 'a'和'b'不同,不是回文串,count=0

中心点 i=1 (字符 'b')

奇数长度扩展 (left=1, right=1):

a [b] c b a^
  • 'b' 是回文串,count=1
  • 尝试扩展到 (0,2
[a b c] b a^   ^
  • 'a'和'c'不同,不是回文串,停止

偶数长度扩展 (left=1, right=2):

a b [c] b a^ ^
  • 'b'和'c'不同,不是回文串,count=0

中心点 i=2 (字符 'c')

奇数长度扩展 (left=2, right=2):

a b [c] b a^
  • 'c' 是回文串,count=1
  • 尝试扩展到 (1,3)
a [b c b] a^   ^
  • 'b'和'b'相同,是回文串,count=2
  • 尝试扩展到 (0,4)

偶数长度扩展 (left=2, right=3):

a b c [b] a^ ^
  • 'c'和'b'不同,不是回文串,count=0

中心点 i=3 (字符 'b')

奇数长度扩展 (left=3, right=3):

a b c [b] a^
  • 'b' 是回文串,count=1
  • 尝试扩展到 (2,4)
a b [c b a]^   ^
  • 'c'和'a'不同,不是回文串,停止

偶数长度扩展 (left=3, right=4):

a b c b [a]^ ^
  • 'b'和'a'不同,不是回文串,count=0

中心点 i=4 (字符 'a')

奇数长度扩展 (left=4, right=4):

a b c b [a]^
  • 'a' 是回文串,count=1
  • 尝试扩展到 (3,5),右侧越界,停止

偶数长度扩展 (left=4, right=5):

  • 右侧越界,count=0

总结计算

总回文子串数量 = 1 + 0 + 1 + 0 + 3 + 0 + 1 + 0 + 1 + 0 = 7

这7个回文子串是:

  1. "a" (i=0)
  2. "b" (i=1)
  3. "c" (i=2)
  4. "bcb" (i=2)
  5. "abcba" (i=2)
  6. "b" (i=3)
  7. "a" (i=4)

时间和空间复杂度

  • 时间复杂度: O(n²)
  • 有 O(n) 个中心点
  • 每个中心点最多扩展 O(n) 次
  • 空间复杂度: O(1)
  • 只使用了常数额外空间

正确写法

class Solution {
public:int countSubstrings(string s) {int result = 0;for(int i = 0; i<s.size();i++){result = result + dfs(s,i,i); //奇数的时候result = result + dfs(s,i,i+1); //偶数的时候}return result;}int dfs(string& s,int left, int right){int count = 0;while(left >= 0 && right <s.size() &&s[left] == s[right]){left--;right++;count++;}return count;}
};

相关文章:

  • 求问,PMP属于职称认证吗?
  • PH热榜 | 2025-06-07
  • Redux Toolkit 快速入门指南:createSlice、configureStore、useSelector、useDispatch 全面解析
  • eNSP-IP数据包分析
  • (纳芯微)NST86-DSCR 精度±0.5℃,低功耗模拟输出温度传感器(-10.9mV/℃)负温度系数
  • CMIP6气候模式资料概览
  • 云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
  • 软件性能测试报告由谁出具?第三方软件测试机构
  • 医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
  • linux中如何在日志里面检索nowStage不等于1的数据的指令
  • Unit 1 深度强化学习简介
  • 机器人模仿学习调研
  • Infrastructure-Based Calibration of a Multi-Camera Rig
  • 基于TurtleBot3在Gazebo地图实现机器人远程控制
  • SQL注入篇-sqlmap的配置和使用
  • 拟合问题处理
  • 【C++进阶篇】智能指针
  • Java并发编程实战 Day 15:并发编程调试与问题排查
  • 论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
  • LeetCode - 199. 二叉树的右视图
  • 搬瓦工做网站方法/seo技术团队
  • wordpress菜单显示在哪里设置/徐州百度seo排名优化
  • 建个企业网站需要多少钱/软件推广赚钱一个10元
  • 邯郸做网站优化/开发一个app需要多少钱
  • 网站建设网站服务/陕西seo顾问服务
  • 门户网站建设哪家好/seo深圳培训班