Problem: 5. 最长回文子串

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N^2)
    • 空间复杂度:O(1)

整体思路

这段代码旨在解决经典的 “最长回文子串” (Longest Palindromic Substring) 问题。问题要求在一个给定的字符串 S 中,找到一个最长的、内容左右对称的连续子串。

该算法采用了一种非常高效且简洁的 中心扩展 (Expand From Center) 算法。其核心思想是,任何一个回文串,都有一个中心。这个中心可能是一个字符(对于奇数长度的回文串,如 “aba” 的中心是 ‘b’),也可能是两个字符之间的空隙(对于偶数长度的回文串,如 “abba” 的中心在两个 ‘b’ 之间)。

算法的逻辑步骤如下:

  1. 统一中心处理

    • 该算法最巧妙的一点是,它通过一个 for 循环 for (int i = 0; i < 2 * n - 1; i++) 来遍历所有可能的中心。
    • 一个长度为 n 的字符串,有 n 个单字符中心和 n-1 个字符间的中心,总共 2n-1 个。
    • 通过 l = i / 2r = (i + 1) / 2 这两个计算,可以巧妙地将这 2n-1 个虚拟中心索引 i 映射到字符串的实际索引起点:
      • i 是偶数时(例如 i=4),lr 会相等(l=2, r=2),这对应一个单字符中心,用于查找奇数长度的回文串。
      • i 是奇数时(例如 i=5),r会比l大1(l=2, r=3),这对应一个字符间中心,用于查找偶数长度的回文串。
  2. 从中心向两边扩展

    • 对于每一个确定的中心 (l, r),算法进入一个 while 循环。
    • 这个循环同时将左指针 l 向左移动 (l--) 和右指针 r 向右移动 (r++),并持续检查以下条件:
      a. 指针没有越界 (l >= 0 && r < n)。
      b. 两边指针指向的字符相等 (s[l] == s[r])。
    • 只要这些条件满足,就说明当前 [l, r] 范围内的子串是一个回文串,可以继续尝试扩展。
  3. 更新最长回文串记录

    • while 循环因不满足条件而终止时,最后一个有效的回文串是在 lr 停止移动之前的位置,即 [l+1, r-1]
    • 该回文串的长度为 (r-1) - (l+1) + 1 = r - l - 1
    • 算法将这个长度与已记录的最长回文串的长度进行比较。如果当前找到的更长,就更新 ansLeftansRight 来记录这个新发现的最长回文串的边界。
  4. 返回结果

    • 在遍历完所有 2n-1 个中心后,ansLeftansRight 中存储的就是全局最长回文子串的起始索引(包含)和结束索引(不包含)。
    • 最后,使用 S.substring(ansLeft, ansRight) 截取并返回结果。

完整代码

class Solution {/*** 找到字符串 S 中的最长回文子串。* @param S 输入的字符串* @return 最长的回文子串*/public String longestPalindrome(String S) {// 将字符串转换为字符数组,可以略微提高字符访问效率。char[] s = S.toCharArray();int n = s.length;// ansLeft: 记录最长回文子串的起始索引(包含)。int ansLeft = 0;// ansRight: 记录最长回文子串的结束索引(不包含)。int ansRight = 0;// 核心循环:遍历所有 2n-1 个可能的中心。// i 是一个虚拟的中心索引。for (int i = 0; i < 2 * n - 1; i++) {// 通过 i 计算出中心扩展的起始左右指针。// 如果 i 是偶数, l=r, 对应单字符中心 (奇数长度回文串)。// 如果 i 是奇数, r=l+1, 对应字符间中心 (偶数长度回文串)。int l = i / 2;int r = (i + 1) / 2;// 从中心 (l, r) 向两边扩展,寻找回文串。while (l >= 0 && r < n && s[l] == s[r]) {l--;r++;}// 循环结束后,最后一个有效回文串的边界是 [l+1, r-1]。// 其长度为 (r-1) - (l+1) + 1 = r - l - 1。// 当前记录的最长长度为 ansRight - ansLeft。if (r - l - 1 > ansRight - ansLeft) {// 如果找到了更长的回文串,则更新记录。// 新的起始索引是 l+1。ansLeft = l + 1;// 新的结束索引(不包含)是 r。ansRight = r;}}// 根据记录的边界,从原始字符串 S 中截取最长回文子串。return S.substring(ansLeft, ansRight);}
}

时空复杂度

时间复杂度:O(N^2)

  1. 外层循环for (int i = 0; i < 2 * n - 1; i++) 遍历了 2n-1 次,其复杂度为 O(N)
  2. 内层循环while (...) 循环是从每个中心向外扩展。在最坏的情况下(例如,字符串本身就是一个大回文串 “aaaaa…”),从中心开始的扩展可能会一直延伸到字符串的两端。每次扩展的操作数最多是 N/2 次(向左 N/2,向右 N/2)。因此,内层循环的复杂度是 O(N)
  3. 综合分析
    总的时间复杂度是外层循环和内层循环复杂度的乘积。即 O(N) * O(N) = O(N^2)

空间复杂度:O(1)

  1. 主要存储开销:算法的核心逻辑只使用了固定数量的整型变量(n, ansLeft, ansRight, i, l, r)来存储指针和结果边界。
  2. toCharArray()char[] s = S.toCharArray(); 创建了字符串的一个副本,占用了 O(N) 的空间。然而,在标准的算法复杂度分析中,这种对输入的表示转换通常不被计入额外辅助空间(auxiliary space),因为核心算法本身(指针操作)并不需要这部分空间(可以直接使用 S.charAt())。
  3. 综合分析
    如果我们只考虑算法逻辑本身所需的额外空间,那么空间复杂度为 O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97596.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97596.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/97596.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六、练习3:Gitee平台操作

练习3&#xff1a;Gitee平台操作 练习目标 掌握Gitee平台的基本操作&#xff0c;包括创建仓库、推送代码、团队协作等。 练习步骤 步骤1&#xff1a;Gitee账号准备 访问 gitee.com注册账号&#xff08;如果还没有&#xff09;登录Gitee 步骤2&#xff1a;配置SSH密钥 # …

Git软件版本控制

软件版本控制作用&#xff1a;软件源码版本管理、多人协作开发、版本多分支开发、代码回滚&#xff08;回退&#xff09;等功能。集中式版本控制&#xff1a;将代码仓库放在一台服务器上&#xff0c;开发时要依赖这台服务器。优点&#xff1a;简单、方便管理、适合中小型项目缺…

生产环境Spark Structured Streaming实时数据处理应用实践分享

生产环境Spark Structured Streaming实时数据处理应用实践分享 一、业务场景描述 我们所在的电商平台需要实时监控用户行为数据&#xff08;如点击、下单、支付等&#xff09;&#xff0c;基于事件级别的流式数据进行实时统计、会话聚合、漏斗分析&#xff0c;并将结果推送到Da…

海康相机开发---HCNetSDK

HCNetSDK&#xff08;Hikvision Network Software Development Kit&#xff09;是海康威视专为旗下安防监控设备打造的二次开发工具包&#xff0c;是连接上层应用与海康设备的核心桥梁。其封装了设备底层通信协议&#xff08;包括私有协议与部分标准协议&#xff09;&#xff0…

构建无广告私人图书馆Reader与cpolar让电子书库随身携带

文章目录前言&#xff1a;告别书荒&#xff0c;拯救灵魂的“摸鱼神器”1、关于Reader&#xff1a;小而美的开源在线阅读器2、Docker部署3、简单使用reader和添加书源4.群晖安装Cpolar工具5.创建reader阅读器的公网地址6.配置固定公网地址前言&#xff1a;告别书荒&#xff0c;拯…

amd cpu是x86架构吗

是的&#xff0c;AMD CPU属于x86架构‌&#xff0c;其64位扩展&#xff08;x86-64&#xff09;最初由AMD设计并成为行业标准。‌ ‌AMD与x86架构的关系‌ ‌技术渊源‌&#xff1a;AMD自1976年起通过技术授权成为x86架构的合法制造商&#xff0c;与英特尔共同主导x86市场。2003…

vercel上线资源无法加载

背景&#xff1a;在本地跑开发服务器没问题&#xff0c;但是部署到 vercel 上就有问题上一次出现类似问题是在更新游戏引擎方法后本地可以跑但是上线没有成功&#xff0c;当时是因为 runner.html 是在部署时通过脚本从远端仓库拉取的&#xff0c;所以解决方案&#xff1a;1.更新…

Node.js 的模块化规范是什么?CommonJS 和 ES6 模块有什么区别?

目录 一、为什么需要模块化&#xff1f; 二、Node.js 的模块化规范 三、CommonJS 模块化 1. 基本语法 2. 特点 3. 缺点 四、ES6 模块&#xff08;ESM&#xff09; 1. 基本语法 2. 特点 3. 在 Node.js 中的使用 五、CommonJS 和 ES6 模块的区别 六、实际开发中的选择…

设计模式:代理模式(Proxy Pattern)

文章目录一、代理模式的定义二、实例分析三、示例代码一、代理模式的定义 代理模式是一种结构型设计模式&#xff0c;它为某个对象提供一个代理或占位符&#xff0c;以控制对这个对象的访问。简单来说代理对象在客户端和目标对象之间起到中介作用&#xff0c;客户端并不会直接操…

数据类型序列化-封装

/// <summary> /// 定义泛型接口 /// </summary> /// <typeparam name"T">T</typeparam> public interface ISettingValue<T> {/// <summary>/// value/// </summary>T DoubleValue { get; }/// <summary>/// key//…

PitVis-2023挑战赛:内镜下垂体瘤手术视频中的手术流程识别|文献速递-深度学习人工智能医疗图像

Title题目PitVis-2023 challenge: Workflow recognition in videos of endoscopic pituitary surgeryPitVis-2023挑战赛&#xff1a;内镜下垂体瘤手术视频中的手术流程识别01文献速递介绍内镜视觉挑战赛与PitVis-2023挑战赛背景及核心内容 “内镜视觉&#xff08;EndoVis&#…

2025年8月个人工作生活总结

本文为 2025年8月工作生活总结。研发编码 无处不在的AI 现在很多地方都在推AI&#xff0c;广西的人工智能走在前列&#xff0c;要赋能各行各业。至于我&#xff0c;主要就是在写点代码&#xff0c;写点交差的文档。其实现在我已经有点分析哪些代码哪些文字是AI写的了。我工作用…

Dubbo常见面试题

1、默认使用的是什么通信框架&#xff0c;还有别的选择吗? 默认也推荐使用netty框架&#xff0c;还有mina。 2、服务调用是阻塞的吗&#xff1f; 默认是阻塞的&#xff0c;可以异步调用&#xff0c;没有返回值的可以这么做。 3、一般使用什么注册中心&#xff1f;还有别的…

简单的加密算法

// 加密函数&#xff08;32位版本&#xff09; //这里的 data 是ID&#xff0c; dword encrypt(dword data, dword key, int shift) {data ^ key; // 第一步&#xff1a;异或混淆// 循环左移&#xff08;shift范围1-31&#xff09;return (data << sh…

升级的MS9125S USB投屏控制芯片(VGAHD输出)

MS9125S是一款USB单芯片投屏器&#xff0c;内部集成了USB 2.0控制器和数据收发模块、视频DAC、HD接口和音视频处理模块&#xff0c;支持压缩视频传输。MS9125S可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备上&#xff0c;支持VGA和HD视频接…

求欧拉回路:Hierholzer算法图解模拟

代码模板&#xff1a;List<Integer> resultList new ArrayList<>();List<Integer> hierholzer() {dfs(0);resultList.add(0);// 数组反转Collections.reverse(resultList);return resultList; }void dfs(int start) {for(int end : G[start]) {if(!vis[star…

Kafka面试精讲 Day 2:Topic、Partition与Replica机制

【Kafka面试精讲 Day 2】Topic、Partition与Replica机制 在“Kafka面试精讲”系列的第二天&#xff0c;我们将深入剖析Kafka最核心的三大数据组织机制&#xff1a;Topic&#xff08;主题&#xff09;、Partition&#xff08;分区&#xff09;与Replica&#xff08;副本&#x…

【备战2025数模国赛】(三)数模常见赛题类型及解决办法

在进行数学建模竞赛时&#xff0c;很多同学面临的第一个挑战是如何对赛题进行归类&#xff0c;并选择合适的模型。本篇梳理了数学建模中最常见的几类赛题&#xff0c;并针对每类题型提供了基本的解决思路&#xff0c;帮助大家快速选择合适的解题方法&#xff0c;高效完成模型构…

LabVIEW测斜设备承压试验台

为保障煤矿井下地质勘探钻孔中测斜装备的可靠运行&#xff0c;设计基于 LabVIEW的钻孔测斜设备承压性能试验台。该试验台以气动增压泵为压力执行元件&#xff0c;结合虚拟仪器与 PLC 控制技术&#xff0c;可精准模拟井下压力环境&#xff0c;完成水压、疲劳等试验&#xff0c;实…

四、练习1:Git基础操作

练习1&#xff1a;Git基础操作 练习目标 通过实际操作掌握Git的基本命令&#xff0c;包括初始化仓库、添加文件、提交更改等。 练习步骤 步骤1&#xff1a;环境准备 确保已安装Git配置用户信息&#xff08;如果未配置&#xff09; # 检查Git版本 git --version# 配置用户信息 g…