当前位置: 首页 > 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;}
};
http://www.xdnf.cn/news/949321.html

相关文章:

  • 具身智能之人形机器人核心零部件介绍
  • 教程:PyCharm 中搭建多级隔离的 Poetry 环境(从 Anaconda 到项目专属.venv)
  • 重启Eureka集群中的节点,对已经注册的服务有什么影响
  • 深入理解JavaScript设计模式之单例模式
  • AirPosture | 通过 AirPods 矫正坐姿
  • 安科瑞户储ADL200N-CT:即插即用破解家庭光伏安装困局
  • HBase学习:通俗易懂的实例解析
  • K8S认证|CKS题库+答案| 10. Trivy 扫描镜像安全漏洞
  • Java中HashMap底层原理深度解析:从数据结构到红黑树优化
  • 人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
  • Excel处理控件Aspose.Cells教程:在Excel 文件中创建、操作和渲染时间线
  • 国内外UI自动化测试工具全景分析:国产创新与国际领先工具对比
  • Rougamo.Fody 实现一个AOP日志
  • UI框架-通知组件
  • TMC2226超静音步进电机驱动控制模块
  • 高抗扰度汽车光耦合器的特性
  • 渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
  • sshd代码修改banner
  • 开发一套外卖系统软件需要多少钱?
  • 简单介绍C++中 string与wstring
  • 动手学深度学习13.3. 目标检测和边界框-笔记练习(PyTorch)
  • 神经网络学习-神经网络简介【Transformer、pytorch、Attention介绍与区别】
  • 盲盒一番赏小程序:引领盲盒新潮流
  • [免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • 分布式光纤声振传感技术原理与瑞利散射机制解析
  • 学习 Hooks【Plan - June - Week 2】
  • 华为云上的K8S怎么使用对象存储配置pod文件持久化。
  • Ubuntu 20.04 联网设置指南
  • python读取SQLite表个并生成pdf文件
  • mac 安装homebrew (nvm 及git)