leetCode 5. 最长回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针

news2025/7/19 20:39:20

5. 最长回文子串 - 力扣(LeetC5. 最长回文子串 - 力扣(LeetCode)5. 最长回文子串 - 力扣(LeetC

给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串


示例 1:

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

示例 2:

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

一、中心扩展法 + 双指针​​​​​​​

我的往期文章有详细介绍​​​​​​​中心扩展法 + 双指针​​​​​​​,大家感兴趣可以看一下:​​​​​​​leetCode 647.回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/133883091?spm=1001.2014.3001.5501

现在我们将用这个方法来解决本文中的此题:5. 最长回文子串 - 力扣(LeetCode)

class Solution {
public:
    vector<int> extend(string& s,int i,int j,int n) {
        while(i>=0 && j<n && s[i] == s[j]) {
            i--;
            j++;
        }
        return {i+1,j-1};
    }
    // 返回以 i, j 为中心的最长回文子串的左右边界
    string longestPalindrome(string s) {
        int n = s.size();
        vector<int> res{0,0};
        for(int i=0;i<n;i++) {
            vector<int> sub1 = extend(s,i,i,n);
            vector<int> sub2 = extend(s,i,i+1,n);
            if (res[1] - res[0] < sub1[1] - sub1[0]) res = sub1;
            if (res[1] - res[0] < sub2[1] - sub2[0]) res = sub2;
        }
        return s.substr(res[0], res[1] + 1 - res[0]);
    }
};
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

 二、动态规划(详细可以看我的往期文章:leetCode 647.回文子串

左边图是dp数组初始化,在填dp数组只会对右上三角进行数据更新,所以右边的图我就不画左下三角的0了。从图中,可得知有9true,即有9回文子串。还可以得知另一个信息,那就是回文子串有:"a","b","d","d","b","a","dd","bddb","abddba"

注:"dd"是回文子串的信息记录在(2,3)这个坐标,"bddb"是回文子串的信息记录在(1,4)这个坐标,"abddba"是回文子串的信息记录在(0,5)这个坐标,若为true,则该子串为回文。

(2,3),(1,4),(0,5)在左对角线上,所以观察的时候可以瞄准这条线上的坐标,分析信息

注:要明确和清晰dp[i][j] 表示区间范围[i,j]的子串是否为回文子串

这样就可以知道一个回文子串的起始和末尾,将其返回, 然后选取出最长回文子串

1.动态规划 二维dp 

class Solution {
public:
    // 动态规划 二维dp 
    string longestPalindrome(string s) {
        vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));
        vector<int> res{0,0};
        for(int i=s.size()-1;i>=0;i--) {
            for(int j=i;j < s.size();j++) {
                if(s[i] == s[j] && (j-i<=1 || dp[i+1][j-1])) {
                    dp[i][j] = true;
                    if (res[1] - res[0] < j - i) res = {i,j};
                }
            }
        }
        return s.substr(res[0], res[1] + 1 - res[0]);
    }
};
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n^2)

2.动态规划 二维dp + 优化空间

class Solution {
public: 
    // 动态规划 二维dp 优化空间
    string longestPalindrome(string s) {
        vector<vector<bool>> dp(2,vector<bool>(s.size(),false));
        vector<int> res{0,0};
        for(int i=s.size()-1;i>=0;i--) {
            for(int j=i;j < s.size();j++) {
                if(s[i] == s[j] && (j-i<=1 || dp[(i+1)%2][j-1])) {
                    dp[i%2][j] = true;
                    if (res[1] - res[0] < j - i) res = {i,j};
                }else {
                    dp[i%2][j] = false;
                }
            }
        }
        return s.substr(res[0], res[1] + 1 - res[0]);
    }
};
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

 3.动态规划 一维dp + 优化空间

class Solution {
public:  
    // 动态规划 一维dp 
    string longestPalindrome(string s) {
        vector<bool> dp(s.size(),false);
        vector<int> res{0,0};
        for(int i=s.size()-1;i>=0;i--) {
            bool pre = false;
            for(int j=i;j < s.size();j++) {
                bool tmp = dp[j];
                if(s[i] == s[j] && (j-i<=1 || pre)) {
                    dp[j] = true;
                    if (res[1] - res[0] < j - i) res = {i,j};
                }else {
                    dp[j] = false;
                }
                pre = tmp;
            }
        }
        return s.substr(res[0], res[1] + 1 - res[0]);
    }
};
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

参考和推荐文章:

647. 回文子串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/palindromic-substrings/solutions/1530868/by-lfool-2mvg/

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

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

相关文章

制造企业如何做好MES管理系统需求分析

随着制造业的不断发展&#xff0c;制造企业对于生产过程的管理需求日益增长。为了提高生产效率和质量&#xff0c;越来越多的制造企业开始关注MES生产管理系统的需求分析。本文将从以下几个方面探讨制造企业如何做好MES管理系统需求分析。 一、明确需求 在进行MES管理系统需求…

利用PHP快速抓取音频数据的方法与技巧

目录 使用cURL库抓取音频数据 优点 潜在问题及解决方案 使用file_get_contents函数抓取音频数据 优点 潜在问题及解决方案 总结 随着互联网的发展&#xff0c;音频内容在网络上的应用越来越广泛&#xff0c;如音乐播放、语音通信等。有时&#xff0c;我们需要从特定的音…

电脑缺失dll文件有什么办法快速解决,dll文件是什么

玩游戏时经常会出现dll文件缺失&#xff0c;那么dll文件是什么&#xff1f;都有哪些办法可以解决dll文件缺失&#xff1f;今天就带大家了解dll文件以及解决dll文件缺失的办法&#xff0c;看完这篇文章相信你会有很大收获&#xff0c;接下来往下看。 一.Dll文件 Dll文件是VC运…

互联网Java工程师面试题·Java 总结篇·第二弹

目录 12、用最有效率的方法计算 2 乘以 8&#xff1f; 13、数组有没有 length()方法&#xff1f;String 有没有 length()方法&#xff1f; 14、在 Java 中&#xff0c;如何跳出当前的多重嵌套循环&#xff1f; 15、构造器&#xff08;constructor&#xff09;是否可被重写&…

汽车安全的未来:毫米波雷达在碰撞避免系统中的角色

随着科技的飞速发展&#xff0c;汽车安全系统变得愈加智能化&#xff0c;而毫米波雷达技术正是这一领域的亮点之一。本文将深入探讨毫米波雷达在汽车碰撞避免系统中的关键角色&#xff0c;以及其对未来汽车安全的影响。 随着城市交通的拥堵和驾驶环境的变化&#xff0c;汽车安全…

腾讯云入选挑战者象限,2023 Gartner容器管理魔力象限发布

10月17日&#xff0c;记者获悉&#xff0c;腾讯云入围在Gartner刚刚发布的2023《容器管理魔力象限》报告&#xff08;Magic Quadrant™ for Container Management&#xff09;中&#xff0c;并位列挑战者象限&#xff0c;执行力维度排名国内第二。 Gartner的魔力象限报告是业界…

Spring: 通过注解获取Bean对象

目录 一, 属性注入 属性注入的优点: 属性注入的缺点 二. Setter注入 Setter注入的优点: Setter注入的缺点: 三, 构造方法注入 (主流方式) 构造方法注入的优点 构造方法注入的缺点 四, Autowired与Resource区别 获取Bean对象也叫对象注入(对象装配), 指把对象取出来放…

阿里云starrocks监控告发至钉钉群

背景&#xff1a;新入职一家公司&#xff0c;现场没有对sr的进行监控&#xff0c;根据开发的需求编写了一个python脚本。 脚本逻辑&#xff1a;抓取sr的be/fe/routine load状态信息&#xff0c;判读是否触发告警&#xff0c;若满足告警条件&#xff0c;则发送告警信息到钉钉群…

C# GFPGAN 图像(人脸面部)修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

小程序首页搭建

小程序首页搭建 1. Flex布局是什么&#xff1f;2. 容器的属性2.1 flex-direction属性2.2 flex-wrap属性2.3 flex-flow属性2.4 justify-content属性2.5 align-items属性2.6 align-content属性 二.首页布局搭建二.1moke模拟数据实现轮播图4.信息搭建 Flex弹性布局 1. Flex布局是…

iperf3交叉编译

简介 iperf3是一个用于执行网络吞吐量测量的命令行工具。它支持时序、缓冲区、协议&#xff08;TCP&#xff0c;UDP&#xff0c;SCTP与IPv4和IPv6&#xff09;有关的各种参数。对于每次测试&#xff0c;它都会详细的带宽报告&#xff0c;延迟抖动和数据包丢失。 如果是ubuntu系…

[ConvNet]卷积神经网络概念解析

在初步接触了深度学习以后&#xff0c;我们把目光投向对于一些图像的识别。 其实在d2l这本书中&#xff0c;我们接触过用深度神经网络去识别一个图像&#xff0c;并且对其进行一个分类操作&#xff0c;核心原理是将图像展开成一维tensor&#xff0c;然后作为特征进行检测。 其…

JAVA基础(JAVA SE)学习笔记(二)变量与运算符

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 第一阶段&#xff1a;Java基本语法 1. Java 语言概述 JAVA基础&#xff08;JAVA SE&#xff09;学习…

源码解析flink文件连接源TextInputFormat

背景&#xff1a; kafka的文件系统数据源可以支持精准一次的一致性,本文就从源码看下如何TextInputFormat如何支持状态的精准一致性 TextInputFormat源码解析 首先flink会把输入的文件进行切分&#xff0c;分成多个数据块的形式&#xff0c;每个数据源算子任务会被分配以读取…

【面试经典150 | 区间】插入区间

文章目录 Tag题目解读题目来源解题思路方法一&#xff1a;合并区间方法二&#xff1a;模拟 其他语言python3 写在最后 Tag 【模拟】【数组】 题目解读 给定一个含有多个无重叠区间的数组&#xff0c;并且数组已经按照区间开始值升序排序。在列表中插入一个新的区间&#xff0…

unity动画_UI动画案例 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 创建基础通用包 在场景上创建一个Cube 选中Cube 在Window下点击Animation拖拽至运行窗口 点击创建 保存后 这个操作是给Cube添加了一个组件 对Cube_添加一个Position动画 设置几个帧位置的坐标(x,y,z)值 点击运行测…

PHP 如何查看php函数源码

一、在git找到php对应的版本 找到对应的分支版本可以下载也可以在线直接查看 通过这个地址 https://github.com/php/php-src 二、下面已shuffle函数举例&#xff0c;版本为7.4 找到对应的版本进入 点击ext&#xff0c;这个文件夹里面是存放函数的目录 在文件夹里搜不到stu…

Linux使用rpm包安装mysql5.7

以前安装过mysql 前言&#xff1a;检查以前是否装有mysql rpm -qa|grep -i mysql安装了会显示&#xff1a;   bt-mysql57-5.7.31-1.el7.x86_64 停止mysql服务和删除之前安装的mysql rpm -e bt-mysql57-5.7.31-1.el7.x86_64查找并删除mysql相关目录 find / -name mysql/va…

react+ts手写cron表达式转换组件

前言 最近在写的一个分布式调度系统&#xff0c;后端同学需要让我传入cron表达式&#xff0c;给调度接口传参。我去了学习了解了cron表达式的用法&#xff0c;发现有3个通用的表达式刚好符合我们的需求&#xff1a; 需求 每天 xx 的时间&#xff1a; 0 11 20 * * ? 上面是…

jQuery+AJAX请求的统一封装

记录一下使用jQueryAJAX对http请求的统一封装 很久都没有使用jquery和ajax的组合了&#xff0c;这里记录一下jquery和ajax的组合简单封装 将来或许有机会重新启用这个组合 新建jquery.request.js&#xff1b;demo目录结构如下 const baseURL http://127.0.0.1:8116;// con…