回文子串问题

news2024/11/19 12:39:53

一:最长回文子串(leetcode 5)

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

示例 2:

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

思路一:

暴力遍历字符串,得到所有符合结果,比较之后求出最长字符串,这种方法最好想到,但是会超时

C++:

class Solution {
public:
    string longestPalindrome(string s) {
        string res="";//存放结果
        string temp="";//存放子串
        for(int i=0;i<s.length();i++)
        {
            for(int j=i;j<s.length();j++)
            {
                temp=temp+s[j];
                string tem=temp;//tem存放子串反转结果
                std::reverse(tem.begin(),tem.end());//反转
                if(temp==tem)
                    res=res.length()>temp.length()?res:temp;
            }
            temp="";
        }
        return res;
    }
};

 

思路二:

双指针中心扩散法,设置左右指针start,end,遍历字符串,以当前遍历的位置向左右两端扩散,并判断start值是否=end的值,如果等于则继续判断,直至不等于,返回start和end指针之间的字符串长度,并判断是否为最长回文子串,最后输出start和end指针之间的字符即可

C++:

class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size();
        if(len==0||len==1)
            return s;
        int start=0;//记录回文子串起始位置
        int end=0;//记录回文子串终止位置
        int mlen=0;//记录最大回文子串的长度
        for(int i=0;i<len;i++)
        {
            int len1=expendaroundcenter(s,i,i);//一个元素为中心
            int len2=expendaroundcenter(s,i,i+1);//两个元素为中心
            mlen=max(max(len1,len2),mlen);
            if(mlen>end-start+1)
            {
                start=i-(mlen-1)/2;
                end=i+mlen/2;
            }
        }
        return s.substr(start,mlen);
        //该函数的意思是获取从start开始长度为mlen长度的字符串
    }
private:
    int expendaroundcenter(string s,int left,int right)
    //计算以left和right为中心的回文串长度
    {
        int L=left;
        int R=right;
        while(L>=0 && R<s.length() && s[R]==s[L])
        {
            L--;
            R++;
        }
        return R-L-1;
    }
};

Python:

class Solution(object):
    def longestPalindrome(self, s):

        def palindrome(s, l, r):
            while l >= 0 and r < len(s) and s[l] == s[r]:
                l -= 1
                r += 1
            return s[l+1:r]
        
        res = ''
        for i in range(len(s)):
            sub1 = palindrome(s, i, i)
            sub2 = palindrome(s, i, i+1)
            if len(sub1) > len(res):
                res = sub1  
            if len(sub2) > len(res):
                res = sub2 
            else :
                res
        return res

 

复杂度分析

时间复杂度:O(n^2)

空间复杂度:O(1)

二:回文子串(leetcode 647)

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"

示例 2:

输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"

方法:双指针中心扩散法,即问题一的法二

C++:

class Solution {
public:
    int countSubstrings(string s) {
        int result = 0;
        for (int i = 0; i < s.size(); i++) {
            result += extend(s, i, i, s.size()); // 以i为中心
            result += extend(s, i, i + 1, s.size()); // 以i和i+1为中心
        }
        return result;
    }
    int extend(const string& s, int i, int j, int n) {
        int res = 0;
        while (i >= 0 && j < n && s[i] == s[j]) {
            i--;
            j++;
            res++;
        }
        return res;
    }
};

 Python:

class Solution:
    def countSubstrings(self, s: str) -> int:
        result = 0
        for i in range(len(s)):
            result += self.extend(s, i, i, len(s)) #以i为中心
            result += self.extend(s, i, i+1, len(s)) #以i和i+1为中心
        return result
    
    def extend(self, s, i, j, n):
        res = 0
        while i >= 0 and j < n and s[i] == s[j]:
            i -= 1
            j += 1
            res += 1
        return res

 

 总结:巧妙利用双指针,从中心扩散进行求解,下面附上原来做的一道最短回文串的链接

最短回文串_小梁今天敲代码了吗的博客-CSDN博客

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

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

相关文章

盛元广通疾病预防控制中心检测管理信息系统

近些年&#xff0c;在疾病预防控制领域&#xff0c;公共卫生事件的发生都是通过信息化手段在日常工作中加以应用以及广泛深入的探索&#xff0c;加快疾控实验室信息化建设进程&#xff0c;可以有效把控不同类型检测任务中的每个节点&#xff0c;严防不同系统填报多次出现信息误…

SpringBoot——热部署

简单介绍&#xff1a; 在之前我们的项目中&#xff0c;当我们在编写了一个新的类并且要应用的时候&#xff0c;需要手动重启服务器重新部署一下&#xff0c;这个过程需要我们手动去完成&#xff0c;但是很多时候&#xff0c;比如我们在做测试&#xff0c;需要反复的修改代码&a…

第14章_视图

第14章_视图 1. 常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不…

【Http协议②】http协议格式,请求格式,常见请求方法,请求报文,请求正文

前言: 大家好,我是良辰丫,上一篇文章我们已经了解过了http协议,这篇文章我将带领大家去学习http协议的一些属性,http协议格式,请求格式,常见请求方法,请求报文,请求正文.跟随我的脚步,一起遨游http的海洋.&#x1f49e;&#x1f49e; &#x1f9d1;个人主页&#xff1a;良辰针不…

第14届蓝桥杯省赛真题剖析-2023年5月7日Scratch编程初级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第135讲。 第14届蓝桥杯Scratch省赛真题&#xff0c;这是2023年5月7日举办的省赛&#xff0c;比赛仍然采取线上形式。试…

Spring Boot 的 Starter 以及实现一个自定义Starter

一、了解 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中一个重要概念&#xff0c;它是一种提供依赖项的方式&#xff0c;简化 Spring 应用程序依赖管理&#xff0c;将一组相关的依赖项打包在一起&#xff0c;并提供一个依赖项描述文件&#xff0c;使开发人员可以…

视觉-激光融合SLAM :LVI - SAM与LIO - SAM的环境配置

目录 1.LIO-SAM配置 1.1 ROS 安装 1.2 安装gtsam 4.0.2 1.3 安装LIO-SAM 1.4 运行LIO-SAM 2. LVI - SAM安装 2.1 一些依赖库的安装 2.2 安装ceres1.1.14 2.3 安装LVI-SAM 1.LIO-SAM配置 机器&#xff1a;Ubuntu 18.04 内存&#xff1a;>16G CPU&#xff1a;Intel &…

电脑看不了视频?这样做,可以快速解决!

案例&#xff1a;我的电脑播放不了视频&#xff0c;这是什么原因。如何才能在电脑上播放视频&#xff1f;有没有解决的办法&#xff1f; 【我工作和学习都离不开电脑&#xff0c;今天工作的时候&#xff0c;我用电脑打开一个视频&#xff0c;却发现视频无法播放&#xff0c;怎…

擎创动态 | 来自华为的深度认可,擎创再获华为鲲鹏技术认证

在数字中国的信息技术应用国产化进程中&#xff0c;擎创科技除持续投入自主产品研发外&#xff0c;还深度适配了涵盖芯片、服务器、操作系统、数据库、中间件、云服务、应用等领域的国产化产品&#xff0c;与华为的合作适配便是其中重要的一环。近期&#xff0c;擎创夏洛克智能…

Install Prometheus Monitoring On Kubernetes Cluster

目录 Node & Software & Docker Images Lists ​Prometheus introduction Download Kubernetes Prometheus Manifest Files Install Prometheus Monitoring Kubernetes Create a Namespace Create a Cluster Role And Binding It Create a Config Map Create…

lwIP更新记05:核心应用文件移动

从 lwIP-2.0.0 开始&#xff0c;lwIP 开发者将一些核心应用从 contrib 仓库移动到 lwIP 仓库的 src/apps 文件夹。 对比版本 lwIP-1.4.1 和 lwIP-2.1.2 的 src 文件夹内容&#xff0c;可以发现 lwIP 2.1.2 版本多了一个 apps 文件夹。 最开始&#xff0c;也就是 2015 年 10 …

【王道·操作系统】第一章计算机系统概述【未完】

一、 操作系统的基本概念 1.1 概念&#xff08;定义&#xff09;&#xff1a;什么是操作系统 操作系统operating system,OS&#xff1a;控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方…

LC 谐振电路

LC电路是各种电子设备中的基本电子组件&#xff0c;尤其是在诸如调谐器&#xff0c;滤波器&#xff0c;混频器和振荡器之类的电路中使用的无线电设备中。在学习之前&#xff0c;我们复习一下电感和电容的原理。 电容就是储存电荷的容器&#xff0c;最基本构成是如下图所示的一个…

uniapp使用express连接mysql数据库

一、安装 express 脚手架 使用winR再输入cmd打开命令提示符&#xff0c;输入如下内容全局安装脚手架 npm i express-generator -g 二、在项目根目录下创建服务 可以在命令提示符中cd到自己项目的根目录下&#xff0c;也可以在HBuilder X里内置的终端运行代码 C:\HBuilderProj…

波奇学C++:动态内存管理,new和delete

内存分区 内存可分为栈&#xff0c;堆&#xff0c;静态区/数据段&#xff0c;常量区/代码段 栈&#xff1a;函数栈帧&#xff0c;临时变量&#xff0c;开辟空间 堆&#xff1a;动态申请的数据 静态区/数码段&#xff1a;静态数据&#xff0c;全局变量 常量区/代码段&#x…

django admin后台管理系统上传添加的图片保存到阿里云oss中

目录 一、配置admin上传图片到阿里云oss 二、配置admin后台上传到阿里云oss的图片为自定义名 问题描述&#xff1a;在开发自己的应用/网页前后台时可以调用阿里云oss的接口将图片上传至oss保存和读取&#xff0c;非常方便。但在django自带的admin后台中如何配置添加的图片也上…

视频美颜SDK在直播领域的应用与挑战

目前&#xff0c;视频美颜技术在视频拍摄领域“大展神通”&#xff0c;因为视频美颜SDK可以帮助主播在直播中展现更加美好的形象&#xff0c;吸引更多的观众&#xff0c;并提升用户体验。然而&#xff0c;视频美颜SDK在直播领域的应用也面临着一些挑战。 一、视频美颜SDK在直…

回溯法【2-5】

假设一个推销员问题由下图定义&#xff0c;用回溯法求解 从1号结点出发的相应最短巡回路径&#xff08;每个顶点刚好到达一次&#xff09;。若用bestL表示搜索过程中产生的当前最优解&#xff0c;剪枝函数 L 设计为&#xff1a; L 已走过的路径长度 当前结点相关的最短边 所…

ChatGPT提示工程课程,吴恩达OpenAI

Principle 1: Write clear and specific instructions 使用明确的分隔符&#xff0c;是LLM知道这个某个单独的字段。 前提设置&#xff1a; import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopena…

LeetCode·每日一题·1080. 根到叶路径上的不足节点·递归

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/solutions/2279048/di-gui-zhu-shi-chao-ji-xiang-xi-by-xun-g-7rfd/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系…