【OJ题解】最长回文子串

个人主页: 起名字真南的CSDN博客

个人专栏:

  • 【数据结构初阶】 📘 基础数据结构
  • 【C语言】 💻 C语言编程技巧
  • 【C++】 🚀 进阶C++
  • 【OJ题解】 📝 题解精讲

在这里插入图片描述


题目链接

最长回文子串


解题思路

1. 初步判断

  • 如果字符串为空,直接返回空字符串。

2. 回文子串性质

回文子串的性质如下:
在这里插入图片描述

因此,判断回文子串时需要考虑两种情况:

  1. 中心是一个字符leftright 指向相同位置)。
  2. 中心是两个字符left 指向左边,right 指向右边)。

接下来需要向两边展开,在展开的过程中判断字符是否相同。

3. 判断是否为回文子串

为了实现上述判断,我们需要以下参数:

  • 不需要改变(每次进入循环重新更新的参数):
    • leftright:当前中心点。
    • string:原字符串。
  • 需要改变(可保留数据的条件变量):
    • maxlen:记录当前最大回文子串的长度。
    • start:回文子串的起始位置(遇到更大的回文子串时更新)。

4. 时间与空间复杂度

  • 空间复杂度:只需开辟少量临时变量,复杂度为 (O(1))。
  • 时间复杂度:需遍历字符串的两种中心,复杂度为 (O(n^2))。

代码实现

以下为代码示例,基于 C++:

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.empty())
            return "";  // 特殊情况处理

        int begin = 0;   // 起始位置
        int maxlen = 0;  // 最大长度

        for(int i = 0; i < s.size(); i++) {
            // 情况1:以单个字符为中心
            Check(s, i, i, begin, maxlen);
            // 情况2:以两个字符为中心
            Check(s, i, i + 1, begin, maxlen);
        }

        // 返回最长回文子串
        return s.substr(begin, maxlen);
    }

    void Check(string& s, int left, int right, int& start, int& maxlen) {
        // 向两边扩展,检查是否为回文
        while(left >= 0 && right < s.size() && s[left] == s[right]) {
            int curlen = right - left + 1;  // 当前回文子串长度
            if(curlen > maxlen) {
                // 更新最大长度与起始位置
                start = left;
                maxlen = curlen;
            }
            left--;
            right++;
        }
    }
};

代码要点

  • 边界判断:注意循环条件中的边界检查,确保 leftright 不越界。
  • 引用传递:需要更新的数据(如 startmaxlen)应通过引用传递。

总结

  • 解题思路清晰:基于中心扩展法。
  • 时间复杂度可接受: (O(n^2)),适用于中小规模的字符串问题。
  • 代码逻辑简洁高效:易于理解与扩展。

如果有任何疑问,欢迎在评论区留言指正,谢谢支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937486.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

若依-帝可得app后端

视频地址 https://www.bilibili.com/video/BV1pf421B71v?t=510.1 APP后端技术栈 架构解析 验证码功能 开发环境使用改的是固定的验证码 12345正式环境使用的是 阿里云的短信方案@Override public void sendSms(String mobile) {// String code = RandomUtil.randomNumbers(5);…

Qt绘制仪表————附带详细说明和代码示例

文章目录 1 效果2 原理3 编码实践3.1 创建仪表属性类3.2 设置类属性3.3 绘制图案3.3.1 设置反走样3.3.2 绘制背景3.3.3 重新定义坐标原点3.3.4 绘制圆环3.3.5 绘制刻度线3.3.6 绘制刻度线上的描述值3.3.7 绘制指针3.3.8 绘制指针数值和单位3.3.9 控制指针变化 扩展福利参考 1 效…

音频客观测评方法PESQ

一、简介 语音质量感知评估&#xff08;Perceptual Evaluation of Speech Quality&#xff09;是一系列的标准&#xff0c;包括一种用于自动评估电话系统用户所体验到的语音质量的测试方法。该标准于2001年被确定为ITU-T P.862建议书[1]。PESQ被电话制造商、网络设备供应商和电…

axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示

接之前的博客设计从0开始边做边学&#xff0c;用vue和python做一个博客&#xff0c;非规范化项目&#xff0c;怎么简单怎么弄&#xff0c;跑的起来有啥毛病解决啥毛病&#xff08;三&#xff09;&#xff0c;目前已经完成了基本的功能demo&#xff0c;但是请求接口不可能每个页…

uniapp的多列选择器

1.代码如下 <template><view class"container"><form><picker mode"multiSelector" :range"multiArray" change"onMultiChange" columnchange"onMultiColumnChange"><view class"picker&q…

C# 探险之旅:第三十三节 - 类型class(静态成员和静态类Static Members 和 Static Classes):一场不“动”声色的冒险

嘿&#xff0c;勇敢的探险家们&#xff01;欢迎再次踏上C#的神秘之旅。今天&#xff0c;我们要探索的是一个神秘而又特别的领域——静态成员和静态类。想象一下&#xff0c;这是一群“懒得动”的家伙&#xff0c;他们不喜欢随着对象的创建而四处奔波&#xff0c;更喜欢安安静静…

国威HB1910数字程控电话交换机 generate.php 未授权RCE漏洞复现

0x01 产品简介 国威HB1910数字程控电话交换机是一款功能强大的通信设备,国威HB1910数字程控电话交换机符合国家工信部YD 344-1990《自动用户交换机进网要求》规范,以及其他多项国家安全标准规范,如YD/T 1141-2007、YD/T 729-1994、YD/T 751-1995等。同时,设备还具备自动检…

信奥赛CSP-J复赛集训(bfs专题)(5):洛谷P3395:路障

信奥赛CSP-J复赛集训(bfs专题-刷题题单及题解)(5):洛谷P3395:路障 题目描述 B 君站在一个 n n n\times n n

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

FastJson反序列化学习-01

&#x1f338; FastJson FastJson是一个由阿里巴巴开发的高性能JSON处理库&#xff0c;支持Java对象与JSON字符串之间的互相转换。 本次漏洞研究基于FastJson的1.2.24版本。也就是最早出现FastJson反序列化漏洞的版本。 CVE-2017-18349&#xff0c;FastJson<1.2.24 &…

【恶意软件检测论文】通过提取 API 语义来实现的一个新颖的安卓恶意软件检测方法

目录 摘要1. 引言2. 相关工作2.1. 基于重新训练的恶意软件检测2.2. 基于应用关系图的恶意软件检测2.3. 基于异常样本识别的恶意软件检测2.4. 基于API聚类的恶意软件检测 3. AMDASE概述4. 基于语义距离的API聚类4.1. API特征提取4.2. API句子生成4.3. API句子编码4.4.聚类中心生…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)

目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则&#xff1a; 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…

location重定向和nginx代理

文章目录 1 location重定向1.1 概述1.2 rewrite跳转1.3 用例1.4 实验1.4.1 基于域名的跳转1.4.2 基于ip的跳转1.4.3 基于后缀名的跳转 2 nginx的代理2.1 nginx内置变量2.2 正向代理2.2.1 固定正向代理2.2.2 自动代理 2.3 反向代理2.3.1 负载均衡的算法2.3.2 负载均衡的特点2.3.…

【Qt】qt基础

目录 一、使用Qt Creator创建qt项目 二、项目文件解析 三、Qt中创建图形化界面的程序的两种方法 四、对象树 五、Qt中处理打印乱码问题的利器&#xff1a;qDebug() 一、使用Qt Creator创建qt项目 1.选择项目模板 选中第一类模板Application(Qt应用程序&#xff0c;包含普…

CSS在线格式化 - 加菲工具

CSS在线格式化 打开网站 加菲工具 选择“CSS在线格式化” 或者直接访问 https://www.orcc.online/tools/css 输入CSS代码&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果

java之集合(详细-Map,Set,List)

1集合体系概述 1.1集合的概念 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中也非常常用。 1.2集合分类 集合分为单列集合和多列集合 Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff…

C语言刷题

1. 题目描述 根据给出的三角形3条边a:b.c(a.b,c<100.000)&#xff0c;计算三角形的周长和面积。 输入描述: 一行&#xff0c;三角形3条边(能构成三角形)&#xff0c;中间用一个空格隔开. 输出描述: 一行&#xff0c;三角形周长和面积保留两位小数&#xff0c;中问用一个空…

自动驾驶控制与规划——Project 1: 车辆纵向控制

目录 零、任务介绍一、环境配置1.1 CARLA的配置1.2 Docker Ubuntu 20.04 ROS2 Foxy的配置 二、算法2.1 定速巡航2.2 自适应巡航2.3 离散PID控制 三、代码实现3.1 代码补全3.2仿真验证 零、任务介绍 课程主页 配置Carla仿真器配置carla-ros-bridge补全src\ros-bridge\carla_s…

Linux高并发服务器开发 第一天(Linux的目录结构 cd用法 终端提示符格式)

目录 1.命令解析器&#xff1a;shell 2.LINUX下的目录结构 3.cd的使用 3.1cd 绝对路径 3.2cd 相对路径 3.3cd 回车 3.4cd - 4. 终端提示符格式 1.命令解析器&#xff1a;shell 默认运行与计算机系统终端的 用来解析用户输入命令的工具 内核&#xff1a;操作系统的核…