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

最长回文子串

给你一个字符串 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.dtcms.com/a/320657.html

相关文章:

  • Redis(④-消息队列削峰)
  • 使用OAK相机实现智能物料检测与ABB机械臂抓取
  • 《Hive、HBase、StarRocks、MySQL、OceanBase 全面对比:架构、优缺点与使用场景详解》
  • Numpy科学计算与数据分析:Numpy数据分析与图像处理入门
  • [激光原理与应用-182]:测量仪器 - 光束型 - 光束质量分析仪
  • 无人机航拍数据集|第9期 无人机风力电机表面损伤目标检测YOLO数据集2995张yolov11/yolov8/yolov5可训练
  • WORD接受修订,并修改修订后文字的颜色
  • 2-等级保护
  • LabVIEW多循环架构
  • (已解决)IDEA突然无法使用Git功能
  • 利用千眼狼sCMOS相机开展冷离子云成像与测量实验
  • Mac上安装和配置MySQL(使用Homebrew安装MySQL 8.0)
  • LeetCode 面试经典 150_数组/字符串_加油站(14_134_C++_中等)(贪心算法)
  • OpenBMC Entity Manager 深度解析:架构、原理与应用实践
  • 【优选算法】多源BFS
  • C#调用Unity实现设备仿真开发
  • Java+uniapp+websocket实现实时聊天,并保存聊天记录
  • (nice!!!)(LeetCode 每日一题) 808. 分汤 (深度优先搜索dfs)
  • Latex中公式部分输入正体的字母\mathrm{c}
  • [激光原理与应用-183]:测量仪器 - 光束型 - 光束参数乘积(BPP)的本质与含义,聚焦能力与传输稳定性的物理矛盾。
  • 汽车零部件深孔加工质控升级:新启航激光频率梳 3D 测量解决传统光学扫描遮挡
  • Linux网络--2、Socket编程
  • 力扣-238.除自身以外数组的乘积
  • 《Leetcode》-面试题-hot100-链表
  • 力扣热题100------287.寻找重复数
  • 大语言模型提示工程与应用:提示词基础使用方式
  • 9.2 通过DuEDrawingControl把eDrawing嵌入到C#中显示
  • windows线程基础
  • leetcode热题——有效的括号
  • FPS游戏准心跳动效果实现指南