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

最长回文子串

给你一个字符串 s,找到 s 中最长的 回文 子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

中心拓展法:

class Solution {
public:string longestPalindrome(string s) {// 边界条件:空字符串直接返回if(s.size() < 1)return s;// 变量定义:int Len1 = 1, Len2 = 1;  // 分别记录奇数/偶数长度回文的当前最大长度(初始为1,单个字符)int MAXLen = 1;          // 全局最长回文的长度(初始为1)int start = 0;           // 全局最长回文的起始位置// 遍历每个字符,将其作为回文中心进行扩展for(int i = 0; i < s.size(); i++) {// 情况1:处理奇数长度的回文(中心是单个字符s[i])int l = i - 1, r = i + 1;  // 从中心向左右两侧扩展while(l >= 0 && r < s.size()) {  // 确保不越界if(s[l] == s[r]) {            // 两侧字符对称,继续扩展Len1 = r - l + 1;         // 更新当前奇数回文的长度l--; r++;                 // 继续向两侧扩展} else {break;                    // 两侧字符不对称,停止扩展}}// 情况2:处理偶数长度的回文(中心是两个相邻字符s[i]和s[i+1])l = i, r = i + 1;  // 从相邻两个字符开始向两侧扩展while(l >= 0 && r < s.size()) {  // 确保不越界if(s[l] == s[r]) {            // 两侧字符对称,继续扩展Len2 = r - l + 1;         // 更新当前偶数回文的长度l--; r++;                 // 继续向两侧扩展} else {break;                    // 两侧字符不对称,停止扩展}}// 计算当前中心(i)下能找到的最长回文长度int currentMax = max(Len1, Len2);// 如果当前中心找到的回文比全局最长更长,则更新全局记录if (currentMax > MAXLen) {MAXLen = currentMax;                  // 更新全局最长长度// 根据当前中心i和最长长度计算起始位置start = i - (MAXLen - 1) / 2;}}// 根据最长回文的起始位置和长度,截取并返回结果return s.substr(start, MAXLen);       }
};

解析:

1. 核心思路

采用中心扩展法求解最长回文子串,利用回文串的对称特性:

  • 回文串可以以单个字符为中心(奇数长度,如 "aba")
  • 或以两个相邻字符为中心(偶数长度,如 "abba")
  • 遍历字符串中每个可能的中心,向两侧扩展寻找最长回文
2. 变量作用
  • Len1:记录以当前字符为中心的奇数长度回文的最大长度
  • Len2:记录以当前字符和下一个字符为中心的偶数长度回文的最大长度
  • MAXLen:全局最长回文子串的长度(初始为 1,因为单个字符也是回文)
  • start:全局最长回文子串的起始索引
3. 关键逻辑
  • 奇数长度回文处理

    • 从 i-1 和 i+1 开始向两侧扩展
    • 每次扩展成功(s[l] == s[r])则更新长度 Len1 = r-l+1
    • 扩展失败则退出循环
  • 偶数长度回文处理

    • 从 i 和 i+1 开始向两侧扩展
    • 每次扩展成功则更新长度 Len2 = r-l+1
    • 扩展失败则退出循环
  • 全局最大值更新

    • 计算当前中心能找到的最长回文长度 currentMax
    • 若 currentMax 大于历史最大值 MAXLen,则更新:
      • MAXLen = currentMax(更新最长长度)
      • start = i - (MAXLen - 1)/2(通过中心和长度计算起始位置)
4. 起始位置计算原理

公式 start = i - (MAXLen - 1)/2 的推导:

  • 对于奇数长度(如长度 5,中心 i=2):start = 2 - (5-1)/2 = 0(正确对应 "abcba" 的起始索引 0)
  • 对于偶数长度(如长度 4,中心 i=1):start = 1 - (4-1)/2 = 1-1=0(正确对应 "abba" 的起始索引 0)
  • 利用整数除法自动处理奇偶数差异,无需额外判断
5. 复杂度分析
  • 时间复杂度:O (n²),n 为字符串长度。每个中心最多扩展 O (n) 次,共 n 个中心
  • 空间复杂度:O (1),仅使用常数个变量,无额外空间开销

http://www.xdnf.cn/news/17308.html

相关文章:

  • 远期(Forward)交易系统全球金融市场解决方案报告
  • Java 之 设计模式
  • Python名称映射技术:基于序列元素的高级访问模式详解
  • [科普] AI加速器架构全景图:从GPU到光计算的算力革命
  • 豆包新模型+PromptPilot:AI应用开发全流程实战指南
  • 【C++高阶五】mapset对红黑树的封装
  • Nestjs框架: 接口安全与响应脱敏实践 --- 从拦截器到自定义序列化装饰器
  • 【昇腾】Atlas 500 A2 智能小站制卡从M.2 SATA盘启动Ubuntu22.04系统,重新上电卡死没进系统问题处理_20250808
  • 大语言模型提示工程与应用:提示词基础使用方式
  • Redis原理,命令,协议以及异步方式
  • 分布式膛压应变测量系统
  • 中国电信清华:大模型驱动的具身智能发展与挑战综述
  • BGP综合实验
  • 代码随想录算法训练营第三十八天、三十九天|动态规划part11、12
  • 考研复习-计算机组成原理-第四章-指令系统
  • 机器人焊机智能流量调节
  • 内容分发机制研究:实测一款多源短视频聚合App
  • isulad + harbor私有仓库登录
  • 从安卓兼容性困境到腾讯Bugly的救赎:全链路崩溃监控解决方案-卓伊凡|bigniu
  • 机器学习概念1
  • STM32HAL 快速入门(二):用 CubeMX 配置点灯程序 —— 从工程生成到 LED 闪烁
  • 服务器登上去,显示 failed to send WATCHDOG 重启有效吗?
  • Android 之 ANR问题的全面解析与优化方案
  • Godot ------ 制作属于自己的卡牌
  • 讲一讲@ImportResource
  • C++ WonderTrader源码分析之自旋锁实现
  • 宁商平台税务新举措:合规护航,服务暖心
  • 视频质量检测中准确率↑32%:陌讯多模态评估方案实战解析
  • Web Worker 性能革命:让浏览器多线程为您的应用加速
  • 使用 Gulp 替换 XML 文件内容