HOT100--(5)最长回文子串

news/2024/5/19 9:47:02/文章来源:https://blog.csdn.net/weixin_52669146/article/details/129292131

点击查看题目详情

  1. 中心扩散法
  • 思路:

遍历字符串,以每个字符为中心点向两边扩散,如果遇到不一样的就跳出循环。以此类推,最后截取最大回文串返回。

  • 细节

字符个数不一定都是奇数。当个数是偶数的是时候,我们可以“忽略”部分重复值。

这是因为:

我们把单个字符看作回文串,比如a;并且多个重复字符也看作回文串,比如aaa。

那么对于abba这种偶数的回文串来说,用普通的扩散方法肯定是不对的,但是我们可以跳过bb那一段,因为已经默认了是回文串。

所以对于上面的问题,我们以当前字符为中心往两边扩散的时候,先要判断和他挨着的有没有相同的字符,如果有,则直接跳过。

那么对于abba来说,a默认不是回文,不做判断;所以从b开始,此时首先判断其右边有无重复值,判断出有,所以跳过b来到a。注意此时的跳过指的是i跳过,意思就是说剩余子串判断,是跳过了重复值的。

而对于现在的b为起点来说,判断的条件是s[right] == s[right+1],所以此时的right是在第二个b上的,也就是说i是跟着right走,判断出是回文、重复,下一轮判断剩余子串就没必要再从起点的下一字符开始了,就直接从边界的下一个开始。 所以i不是使用++来迭代的。

还有一个注意的点,当剩余的子串大小不够maxsize大时,可以直接跳出循环了,因为即使它是回文串,也不够maxsize大

class Solution {
public:string longestPalindrome(string s) {if(s.size() < 2){return s;}int maxsize = 0, start = 0;//长度最大值和字符串起始位置(截取字符串)for(int i = 0;i < s.size();){//若不满足长度要求,提前退出//如果剩余子串个数不够,直接退出,因为即使它是回文串,个数也没有maxsize的多//size-i代表的是起点,也就是剩余子串的中间点,说明size-i是一半//maxsize/2代表的是目前最长子串的一半//所以相当于一半和一半比较if(s.size()-i <= maxsize/2)break;int right = i;int left = i;//跳过重复值while(right < s.size()-1 && (s[right+1] == s[right])){++right;}i = right+1;//迭代i,从right的右边开始//left为0的时候,也就是刚开始的时候不做判断while(right < s.size()-1 && left > 0 && (s[right+1] == s[left-1])){++right;--left;}//停止循环,此时的左右边界正好在边界值上if(right-left+1 > maxsize){start = left;//记录下此时的最长子串的起点,最后直接切割maxsize = right-left+1;}}//string substr (size_t pos = 0, size_t len = npos) const;return s.substr(start,maxsize);}
};

运行结果:

在这里插入图片描述

  1. 暴力解法

通俗易懂,就是每个字符不断向右扩大区间分别去比较是否回文:

class Solution {
public:string longestPalindrome(string s) {if(s.size()<2){return s;}int start = 0,maxsize = 0;for(int i = 0;i < s.size()-1;i++){for(int j = i;j < s.size();j++){//j-i是边界,是剩余字符的总长度,而不是一半if(j - i < maxsize){continue;}if(isPalindrome(s,i,j)){if(maxsize < j-i+1){start = i;maxsize = j-i+1;}}}}return s.substr(start,maxsize);}bool isPalindrome(string& s,int left, int right){while(left < right){if(s[left++] != s[right--]){return false;}}return true;}
};

运行结果肯定会比第一种方法慢:

在这里插入图片描述

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

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

相关文章

Canal数据同步配置

文章目录Canal数据同步配置0.canal工作原理1.**检查binlog功能是否有开启**2.如果显示状态为OFF表示该功能未开启&#xff0c;开启binlog功能3.**在mysql里面添加以下的相关用户和权限**4.下载安装Canal服务5.修改配置文件6.进入bin目录下启动7.idea中配置Canal数据同步配置 c…

Java接口专题

基本介绍 接口给出一些没有实现的方法&#xff0c;封装到一起&#xff0c;到某个类使用时再根据具体情况把这些方法写出来。 注意&#xff1a;在jdk7之前&#xff0c;接口里所有的方法都是抽象方法。在jdk8之后接口中可以有静态方法&#xff0c;默认方法 interface 接口名{/…

MySQL 数据库创建不了外键约束

在数据库的表里面创建不了外键约束❓❓❓ 没错&#xff0c;以我名侦探 q 的分析&#xff08;狗屁&#xff01;&#xff01;&#xff01;&#xff09;&#xff0c;真相只有一个❗❗❗ 那就是&#xff1a;你表的存储引擎非 InnoDB&#xff0c;外键约束只有存储引擎是 InnoDB 才…

flutter window安装过程

这里写自定义目录标题#下载相关官网地址&#xff1a;https://flutter.cn/docs/get-started/install/windows 根据官网下载相关包flutter_windows_3.7.5-stable.zip 解压到c盘&#xff0c;在path配置相关解压路径(c:\flutter)。 执行 where flutter dart &#xff0c;发现没有提…

APP测试面试题汇总(基础篇、进阶篇)

一、基础篇1、请介绍一下&#xff0c;APP测试流程&#xff1f;APP测试流程与web测试流程类似&#xff0c;分为如下七个阶段&#xff1a;1.根据需求说明书编写测试计划&#xff1b;2.制定测试方案&#xff0c;主要是测试任务、测试人员和测试时间的分配&#xff1b;3.测试准备&a…

离散事件动态系统

文章目录离散事件动态系统ppt离散事件系统建模离散事件动态系统的基本组成元素离散事件动态系统仿真具体建模petri建模实例离散事件动态系统 ppt ppt 仿真建模步骤 离散事件系统建模 from&#xff1a;离散事件系统建模 离散事件动态系统的基本组成元素 &#xff08;1&am…

【备战面试】每日10道面试题打卡-Day2

本篇总结的是Java基础知识相关的面试题&#xff0c;后续也会更新其他相关内容 文章目录1、 和 equals 的区别是什么&#xff1f;2、你重写过 hashcode 和 equals 吗&#xff0c;为什么重写equals时必须重写hashCode方法&#xff1f;3、为什么Java中只有值传递&#xff1f;4、BI…

工业机器人有哪些类型?如何利用工业网关集中监测管理?

工业机器人在制造业中的应用与日俱增&#xff0c;使用工业机器人&#xff0c;不仅提高了设备和场地的利用率&#xff0c;还能保持稳定的产品水平。随着工业机器人的大规模部署&#xff0c;对于数量众多、类型各异、功能不一的机器人的监测、管理和维护&#xff0c;也成为企业面…

如何提高软件测试效率 降低开发成本?

1、单元测试以开发人员为主 测试分工需根据测试人员的特点进行&#xff0c;而单元测试应以开发人员为主&#xff0c;以保障每个单元能够完成设计的功能。集成测试也可以以开发人员为主进行。当软件体系结构完成后&#xff0c;独立测试人员应尽量选择比较熟悉相关领域的人员。​…

Webpack-好文

webpack是一个前端资源加载/打包工具&#xff0c;会根据模块的依赖关系进行静态分析&#xff0c;然后将这些模块按照指定的规则生成对应的静态资源Webpack打包js文件创建一个文件夹&#xff0c;cmd进入到终端&#xff0c;运行npm install -g webpack webpack-cli安装webpack we…

原生微信小程序引入npm和安装Vant Weapp

目录一、引入npm安装Vant Weapp1、引入npm2、安装Vant Weapp3、修改 app.json4、修改 project.config.json二、构建npm一、引入npm安装Vant Weapp 环境&#xff1a;Windows10 开发工具&#xff1a;微信开发者工具 本地环境&#xff1a;已安装过node.js 1、引入npm cmd进入到你…

动态内存基础(一)

动态内存基础 ● 栈内存 堆内存 V.S. – 栈内存的特点&#xff1a;更好的局部性&#xff0c;对象自动销毁 – 堆内存的特点&#xff1a;运行期动态扩展&#xff0c;需要显式释放 ● 在 C 中通常使用 new 与 delete 来构造、销毁对象 int* fun() {int res;return &res; //…

|干货 | 五种常用类型之String字符串详解

一. 背景说明小白&#xff1a;哥&#xff0c;java中String是最常用类型&#xff0c;Redis中也是吗?哥&#xff1a;差不多&#xff0c;我给你稍微讲一下。二. 数据类型依据Redis官网&#xff0c;目前Redis数据类型共计九种。具体整理如下&#xff1a;常用的数据类型有&#xff…

Windows 11 安装 Docker Desktop

Windows 环境安装 WSL2 WSL 简介 WSL 全称是 Windows Subsystem for Linux &#xff0c;适用于 Linux 的 Windows 子系统&#xff0c;可让开发人员按原样运行 GNU/Linux 环境&#xff0c;包括大多数命令行工具、实用工具和应用程序&#xff0c;且不会产生传统虚拟机或双启动设…

九州云出席全球人工智能开发者先锋大会,圆桌论道开源未来

2月25日-26日&#xff0c;2023年全球人工智能开发者先锋大会&#xff08;GAIDC&#xff09;在临港成功召开。本届盛会以“向光而行的开发者”为主题&#xff0c;汇集政府职能部门领导、国内外知名专家学者、具有国际影响力的开源创业者&#xff0c;聚焦前瞻探索、开源开放、人才…

运动控制器PSO视觉飞拍与精准输出的C++开发(二):多轴PSO等距/周期输出

本文主要介绍正运动技术EtherCAT控制器在VS平台采用C语言实现的各种PSO功能。正运动提供多种PSO模式供用户搭配不同的场景使用。 上节讲解了采用TABLE寄存器存储的数据表触发比较&#xff0c;本节主要讲解矢量比较两种模式&#xff1a;等距周期比较输出&#xff0c;固定时间周…

python海龟绘图

一、基础 &#xff08;一&#xff09;介绍 海龟绘图&#xff08;Turtle Graphics&#xff09;&#xff1a;“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始…

JAVA版B2B2C商城源码多商户入驻商城

三勾商城多商户是开发友好的微信小程序商城&#xff0c;框架支持SAAS&#xff0c;支持发布 iOS Android 公众号 H5 各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉/淘宝&#xff09;等多个平台&#xff0c;不可多得的二开神器&#xff0c; 为大中小企业提供极致的移…

基于龙芯+国产FPGA 的VPX以太网交换板设计(一)

“棱镜门”的曝光&#xff0c;暴露出我国的信息安全存在极大的安全隐患&#xff0c;作为信息传输 载体的网络设备&#xff0c;其国产化需求迫切&#xff0c;国产处理器、国产可编程逻辑器件、以太网交 换芯片等具有良好的应用前景&#xff0c;另一方面&#xff0c;宽带数据业务…

“高退货率”标签引热议,亚马逊跨境电商是好是坏?

在多数卖家不知情的情况下&#xff0c;亚马逊“高退货率”标签上线&#xff0c;该消息已被官方证实&#xff0c;目的是为了践行以客户为中心的理念和推动卖家提升服务。 官方确认上线“高退货率”标签 近期&#xff0c;有亚马逊卖家发现产品详情页出现了“高退货率”标签&…