代码随想录算法训练营第六十天| LeetCode647. 回文子串 、516.最长回文子序列

news2024/11/20 21:20:01

一、LeetCode647. 回文子串 

题目链接/文章讲解/视频讲解:https://programmercarl.com/0647.%E5%9B%9E%E6%96%87%E5%AD%90%E4%B8%B2.html

状态:已解决

1.思路 

        这道题我只想出来了暴力解法,动规解法并没有想出来。根据视频讲解才把它想出来。

(1)确定dp数组以及下标含义:

        本题如果定义dp[i] 为 下标i结尾的字符串有 dp[i]个回文串的话,我们会发现很难找到递归关系。那要怎么确定dp数组呢?根据回文串的性质:

        当我们已知s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。也就是说,当确定一个范围是回文串时,我们就要确定这个范围向外面延申的两头是不是相等的,限定范围需要起点和终点,故dp数组应该是二维的:回文串的下表范围[i,j],则判断子字符串(下表范围[i + 1, j - 1])) 是否是回文。

        故dp数组定义为:dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。

(2)确定递推公式: 

确定递推公式时,由于要考虑 i+1 和 j-1 的边界问题,需要分析如下几种情况:

当s[i]与s[j]不相等,dp[i][j]一定是false。

当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况

  • 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串
  • 情况二:下标i 与 j相差为1,例如aa,也是回文子串
  • 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。

(3)初始化dp数组:

        因为值都会被覆盖,且不可能初始化true(一开始全部都为回文串了,后面无论怎么判断也都会是true),故统一初始化为false。

(4)确定遍历顺序:

根据递推公式,情况三是根据dp[i + 1][j - 1]是否为true,来判断dp[i][j]是否为true的,故需要确定左下角的值,因此遍历顺序应该是从下到上、从左到右。(或者以列遍历)

(5) 举例推导dp数组:

举例,输入:"aaa",dp[i][j]状态如下:

2.代码实现 

class Solution {
public:
    int countSubstrings(string s) {
        vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));
        int result = 0;
        for(int i=s.size()-1; i>=0; i--){
            for(int j=i;j<s.size();j++){ //根据区间定义,i必须比j小.
                if(s[i] == s[j]){
                    if(j-i<=1){
                        result++;
                        dp[i][j] = true;
                    }else if(dp[i+1][j-1]){
                        result++;
                        dp[i][j] = true;
                    }
                }
            }
        }
        return result;
    }
};

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

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

二、516.最长回文子序列 

题目链接/文章讲解/视频讲解:https://programmercarl.com/0516.%E6%9C%80%E9%95%BF%E5%9B%9E%E6%96%87%E5%AD%90%E5%BA%8F%E5%88%97.html

状态:已解决

1.思路 

        这题比上道题简单一点,因为求的是回文子序列不要求连续了。

(1)确定dp数组以及下标含义:

        dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]

(2)确定递推公式:

        还是分两种大情况:

① 如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;

② 如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。

加入s[j]的回文子序列长度为dp[i + 1][j]。

加入s[i]的回文子序列长度为dp[i][j - 1]。

那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);

(3)初始化dp数组:

        首先要考虑当i 和j 相同的情况,从递推公式:dp[i][j] = dp[i + 1][j - 1] + 2; 可以看出 递推公式是计算不到 i 和j相同时候的情况。所以需要手动初始化一下,当i与j相同,那么dp[i][j]一定是等于1的,即:一个字符的回文子序列长度就是1。

        其他情况dp[i][j]初始为0就行,这样递推公式:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); 中dp[i][j]才不会被初始值覆盖。        

        这里我为了提高效率就把初始化定义在递推公式的循环里面了。

(4)确定遍历顺序:

        从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1],如图:

        故要从下往上、从左到右。

(5)举例推导dp数组:

输入s:"cbbd" 为例,dp数组状态如图:

        最后返回dp[0][s.size()-1]即可

2.代码实现 

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
        int length = 0;
        for(int i=s.size()-1; i>=0; i--){
            for(int j=i;j<s.size();j++){ //根据区间定义,i必须比j小.
                if(s[i] == s[j]){
                    if(j-i==0){
                        dp[i][j] = 1;
                    }else{
                        dp[i][j] =  dp[i+1][j-1]+2;
                    }
                }else{
                    dp[i][j] = max(dp[i+1][j],dp[i][j-1]);
                }
            }
        }
        return dp[0][s.size()-1];
    }
};

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

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

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

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

相关文章

MT8370_联发科MTK8370(Genio 510)芯片性能规格参数

MT8370芯片是一款利用超高效的6nm制程工艺打造的边缘AI平台&#xff0c;具有强大的性能和功能。这款芯片集成了六核CPU(2x2.2 GHz Arm Cortex-A78 & 4x2.0 GHz Arm Cortex-A55)、Arm Mali-G57 MC2 GPU、集成的APU(AI处理器)和DSP&#xff0c;以及一个HEVC编码加速引擎&…

zip file is empty

从下找到报错的jar包。展开这个jar包&#xff0c;看下是否正常&#xff0c;正常的是能够展开看到一些文件夹以及里面的类&#xff0c;如下&#xff1a;如果不正常&#xff0c;就删除这个jar包&#xff0c;同时找到这个jar包在本地maven仓库的地址&#xff0c;也删除掉&#xff…

鸿蒙内核源码分析(文件句柄篇) | 你为什么叫句柄

句柄 | handle int open(const char* pathname,int flags); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd);只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大…

ssrf漏洞学习——基础知识

一、SSRF是什么&#xff1f; SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能…

天府锋巢直播产业基地构建成都电商直播高地

天府锋巢直播产业基地自成立以来&#xff0c;一直秉承着创新、协同、共赢的发展理念&#xff0c;吸引了众多直播企业纷纷入驻。随着直播产业的迅猛发展&#xff0c;改成都直播基地内的配套服务也显得尤为重要。本文将深入探讨入驻天府锋巢直播产业基地后&#xff0c;配套的直播…

Agent AI智能体:我们的生活即将如何改变?

你有没有想过&#xff0c;那个帮你设置闹钟、提醒你朋友的生日&#xff0c;甚至帮你订外卖的智能助手&#xff0c;其实就是Agent AI智能体&#xff1f;它们已经在我们生活中扮演了越来越重要的角色。现在&#xff0c;让我们一起想象一下&#xff0c;随着这些AI智能体变得越来越…

20240510每日后端---聊聊文件预览,doc,image,ppt转PDF预览

一、引入依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>crac…

从头开始的建材类电商小程序开发指南

在当今数字化时代&#xff0c;小程序已经成为了许多企业推广和销售的重要渠道。对于建筑材料行业来说&#xff0c;开发一个属于自己的小程序商城不仅可以提升产品曝光度&#xff0c;还可以提供更好的用户购物体验。下面&#xff0c;我们将逐步教你如何开发建筑材料行业小程序。…

佛山市举办2024年护士节庆祝活动

“作为一名在护理岗位上工作了39年的护士,能够在退休前参加这样温情的护士节活动,获得一个纪念胸章和一份荣誉证书,让我很感动!”第七届“南粤好护士”、佛山市第一人民医院急诊科护士长罗银秋说道。5月10日下午,由佛山市卫生健康局主办、佛山市护理学会协办、佛山市第一人民医…

CSS-页面导航栏实现-每文一言(过有意义的生活,做最好的自己)

&#x1f390;每文一言 过有意义的生活,做最好的自己 目录 &#x1f390;每文一言 &#x1f6d2;盒子模型 &#x1f453;外间距 (margin) &#x1f97c;边框 &#x1f45c;内边距 切换盒子模型计算方案&#xff1a; &#x1f3a2; 浮动布局 浮动特点 &#x1f3c6;导航…

wandb: - 0.000 MB of 0.011 MB uploaded持续出现的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Ubuntu系统下编译OpenCV4.8源码

OpenCV4.8源码编译与安装 其实很简单&#xff0c;只要三步即可搞定&#xff0c;第一步是下载指定版本的源码包&#xff1b;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持&#xff1b;第三步就是编译OpenCV源码包生成安装文件并安装。 01下载OpenCV4.8源码包 在Ubunt…

智慧公厕,运用数据提升公共厕所管理水平!

随着城市人口的增加和生活水平的提高&#xff0c;公共厕所的管理变得越来越重要。传统的厕所管理方式已经无法满足人们对卫生、便利和舒适的需求。而智慧公厕作为新一代公厕管理方式&#xff0c;通过运用数据技术和大数据分析手段&#xff0c;彻底改变了公厕管理的模式&#xf…

【系统架构师】-案例篇(七)信息安全

某软件公司拟开发一套信息安全支撑平台&#xff0c;为客户的局域网业务环境提供信息安全保护。该支撑平台的主要需求如下&#xff1a; 1.为局域网业务环境提供用户身份鉴别与资源访问授权功能&#xff1b; 2.为局域网环境中交换的网络数据提供加密保护&#xff1b; 3.为服务…

真驱鸟农业专用插电款驱鸟器,防喜鹊、麻雀各种鸟类

成年喜鹊的栖息地非常多样化&#xff0c;它们常常在人类活动的区域出没&#xff0c;喜欢把鸟巢建在民宅旁边的大树上、旷野的高树上或者电线塔杆上。白天&#xff0c;它们会飞到农田等开阔的地方觅食&#xff0c;到了傍晚则会返回巢内栖息。 喜鹊食性杂&#xff0c;它们的食物组…

2008NOIP普及组真题 4. 立体图

线上OJ&#xff1a; 一本通-1977&#xff1a;【08NOIP普及组】立体图 核心思想&#xff1a; 本题采用模拟方法一个一个画小方块&#xff08;虽然画的是立体空间的积木&#xff0c;但本质还是在二维平面上画图形&#xff09; 本题的难点在于&#xff1a; 1、如何确定二维平面画…

传输层之 TCP 协议

TCP协议段格式 源/目的端口号&#xff1a;表示数据是从哪个进程来&#xff0c;到哪个进程去。 序号&#xff1a;发送数据的序号。 确认序号&#xff1a;应答报文的序号&#xff0c;用来回复发送方的。 4 位首部长度&#xff1a;一个 TCP 报头&#xff0c;长度是可变的&#xff…

产品想在网络媒体上做营销宣传推广有什么好方法?

作为公司宣传负责人,我深知产品在网络媒体上的营销推广对于品牌建设和市场扩张的重要性。然而,在过去,当我们想要在网络媒体上推广产品时,我面临了诸多挑战和困境。 以前,我常常需要直接联系各大网络媒体,从海量的信息中筛选出合适的媒体平台,然后逐一发送邮件、拨打电话甚至亲…

图片无损压缩工具-VIKY

一、前言 Viky v3.4是一款功能强大的图片压缩工具&#xff0c;它能够提供高效的图片无损压缩服务。通过使用独特的压缩算法&#xff0c;该软件在显著减小图片文件大小的同时&#xff0c;还保持了图像的清晰度和色彩饱和度&#xff0c;确保了图像质量的优异表现。 二、软件特点…

layui select 绑定onchange事件失效

layui select 绑定onchange事件失效 问题背景解决方案 问题背景 在日常工作中&#xff0c;可能会用到页面 freemaker 以及 layui 前端框架&#xff0c;这个时候直接在 select 上面绑定 onchange 事件往往是不生效的&#xff0c;错误的方式 这种方式给 select 绑定的 onchange…