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

news2024/9/25 3:26:18

点击查看题目详情

  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.coloradmin.cn/o/382562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习红客技术必备,手把手教你成为“安防第一人”

互联网时代已悄悄来临&#xff0c;作为新时代的人们&#xff0c;我们日常生活、工作、学习方面都需要借助互联网来完成&#xff0c;这样&#xff0c;又产生一种新的问题&#xff0c;那就是网络安全的问题&#xff0c;有时我们拼命加班好不容易完成的东西&#xff0c;在一夜之间…

优化Linux系统性能的必杀技:调整进程优先级!学会使用nice命令,让你的系统飞一般的顺畅!

文章目录前言一. nice命令介绍1.1 nice的介绍1.2 cpu资源的调度1.3 nice是控制内核吗&#xff1f;二. 语法格式及常用选项三. 参考案例3.1 将ls命令的优先级调整为最高3.2 将 find 命令的优先级调整为最低3.3 如何查看nice值四. nice和renice的区别总结前言 大家好&#xff0c…

Zookeeper的安装

目录 Zookeeper的安装 1、环境准备 2、上传 3、解压文件到opt/zookeeper目下 4、安装完后进入zookeeper&#xff0c;找到conf目录 5、复制zoo_sample.cfg 6、编辑zoo.cfg 7、复制一份会话&#xff0c;进入zookeeper安装目录&#xff0c;创建一个文件夹zkdata&#xff0…

Linux·DMA 与零拷贝技术

DMA 与零拷贝技术注意事项&#xff1a;除了 Direct I/O&#xff0c;与磁盘相关的文件读写操作都有使用到 page cache 技术。1. 数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时&#xff0c;可以等价为进行如下的系统调用&#xff1a;File.read(file, buf, len);…

NOC2021年测试卷3

1. 角色初始位置坐标是(0,0),执行下面程序后,角色会出现在什么位置上?( ) A. x坐标为10,y坐标为50B. x坐标为40,y坐标为50C. x坐标为50,y坐标为40D. x坐标为30,y坐标为502. 执行下面程序后,按一次→键,兔子会?() A. 向右移动10步B. 向左移动10步C. 向上移动…

入职外包三个月,我提桶跑路了

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

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

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

Java 对象深拷贝

需求 写一个java对象深拷贝工具&#xff0c;用以对象深拷贝。 分析 在 Java 中&#xff0c;变量间值的传递分为两种。对于 int,char,string,等基本数据类型进行值传递时&#xff0c;使用值传递。即原变量 a 的值与新变量 b 的值相等&#xff0c;且 a 与 b 拥有不同的内存地址…

HTML认知

HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径&#xff08;常…

win10搭建android monkeyrunner自动化测试环境

本文记录一下monkeyrunner环境搭建遇到的各种坑&#xff0c;以免以后再次踩坑。首先要提一下巨坑&#xff0c;务必要安装java 8&#xff08;本文记录于2023.3&#xff09;&#xff0c;安装其他版本java&#xff0c;运行monneyrunner会有很多问题&#xff0c;见第七节。 一、安…

Threejs 教程1

threejs核心概念场景、照相机、对象、光、渲染器等1.1.场景Scene 场景是所有物体的容器&#xff0c;对应着显示生活中的三维世界&#xff0c;所有的可视化对象级相关的动作均发生在场景中。1.2.照相机Camera照相机是三维世界中的观察者&#xff0c;类似与眼睛。为了观察这个世界…

5款软件压力测试工具分享

一、什么是软件压力测试? 软件压力测试是一种基本的质量保证行为&#xff0c;它是每个重要软件测试工作的一部分。软件压力测试的基本思路很简单&#xff1a;不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行…

达梦: DmAPService可以手动开启,但是不能开机自启

在部署生产环境安全版数据库发现&#xff0c;DmAPService服务不能开机自启&#xff0c;这样会导致服务器重启后&#xff0c;部署的定时备份任务不能够成功备份数据。 为了在服务器重启后&#xff0c;不影响定时任务自动备份数据库&#xff0c;现将解决这个问题的办法总结如下&a…

《MySql学习》 MySQL的 加锁规则

MySQL加锁原则 两个原则 原则 1&#xff1a;加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间&#xff08;区间锁和行锁&#xff09;。原则 2&#xff1a;查找过程中访问到的对象&#xff08;索引&#xff09;才会加锁。 两个优化 1.优化 1&#xff1a;索引上…

美团2面:如何保障 MySQL 和 Redis 数据一致性?这样答,让面试官爱到 死去活来

美团2面&#xff1a;如何保障 MySQL 和 Redis 的数据一致性&#xff1f; 说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0c;类似如下&#xff1a; 如何保障 MySQL 和 Redis…

JavaSE学习进阶 day1_02 继承(面向对象第二大特性)

第三章 继承 &#xff08;面向对象的第二大特性&#xff09; 3.1 概述 3.1.1 引入 假如我们要定义如下类: 学生类,老师类和工人类&#xff0c;分析如下。 学生类 属性:姓名,年龄 行为:吃饭,睡觉 老师类 属性:姓名,年龄&#xff0c;薪水 行为:吃饭,睡觉&#xff0c;教书 班…

C++ List链表使用

1. list的介绍及使用1.1 list的介绍1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个…

百度飞桨PaddleSpeech的简单使用

PaddleSpeech 是基于飞桨 PaddlePaddle 的语音方向的开源模型库&#xff0c;用于语音和音频中的各种关键任务的开发&#xff0c;包含大量基于深度学习前沿和有影响力的模型&#xff0c;一些典型的应用示例如下&#xff1a;语音识别、语音翻译 (英译中)、语音合成、标点恢复等。…

《商用密码应用与安全性评估》第一章密码基础知识1.2密码评估基本原理

商用密码应用安全性评估&#xff08;简称“密评”&#xff09;的定义&#xff1a;在采用商用密码技术、产品和服务集成建设的网络与信息系统中&#xff0c;对其密码应用的合规性、正确性、有效性等进行评估 信息安全管理过程 相关标准 国际:ISO/IEC TR 13335 中国:GB/T …

跨境电商独立站到底有什么优缺点?

无论你在哪个行业&#xff0c;都有优点和缺点&#xff0c;正如人们常说的&#xff0c;人无完人。那么我们就来谈谈最近比较多人关注的跨境电商独立网站的缺点:1. 这个过程很麻烦。跨境电商独立站的有效周期需要比较长&#xff0c;因为前期需要投入大量的精力&#xff0c;比如推…