算法 DAY57 动态规划13 647. 回文子串 516.最长回文子序列

news2024/11/17 17:33:34

647. 回文子串

暴力解法:两层for循环,再加一个判断是否是回文子串,时间复杂度O(n3)
五部曲
1、
判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于,子字符串(下表范围[i + 1, j - 1])) 是否是回文。

所以为了明确这种递归关系,我们的dp数组是要定义成一位二维dp数组。

布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
确定递推公式

2、在确定递推公式

当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、初始化
先全部给false

4、遍历顺序
根据dp[i][j]依赖 dp[i + 1][j - 1]
dp[i + 1][j - 1] 在 dp[i][j]的左下角
在这里插入图片描述
所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。同时,根据dp的定义,j>=i 是一定的。

class Solution {
public:
    int countSubstrings(string s) {
        vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));
        int res = 0;
        for(int i = s.size()-1; i>=0;--i){
            for(int j = i; j<s.size();++j){
                if(s[i] == s[j]){
                    if(j-i<=1) {
                        res++;
                        dp[i][j] = true;
                    }
                    else if(dp[i+1][j-1]){
                        dp[i][j] = true;
                        res++;
                    }
                }
            }
        }
        return res;
    }
};

516.最长回文子序列

回文子串是要连续的,回文子序列可不是连续的!
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。

放在里面,让j直接从i开始也可以(见版本2代码)

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
       
       for(int i = 0; i<s.size();++i) dp[i][i] = 1;
        for(int i = s.size()-1;i>=0;--i){
            for(int j = i+1; j<s.size();++j){
                 if(s[i] == s[j]) 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];
    }
};

版本2:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
       
       //for(int i = 0; i<s.size();++i) dp[i][i] = 1;
        for(int i = s.size()-1;i>=0;--i){
            for(int j = i; j<s.size();++j){
                 if(s[i] == s[j]) {
                     if(j-i == 0) dp[i][j] = 1;
                     else if(j-i == 1) dp[i][j] = 2;
                     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];
    }
};

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

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

相关文章

CLion安装(详细步骤+截图)

目录 一、CLion-2021.1.3.exe 下载 二、运行环境mingw-w64压缩包下载 三、 安装插件 ---- ide-eval-resetter-2.1.13压缩包下载 一、CLion-2021.1.3.exe 下载 Other Versions - CLion (jetbrains.com) 1、下载 2、更改路径 &#xff08;不要放在含有中文的路径下&a…

【Java面试】Java基础-集合相关知识点(1)

文章目录 1. 集合有哪些类&#xff1f;2. ArrayList3. Map主要有哪些类&#xff1f; 容器主要包括 Collection 和 Map 两种&#xff0c;Collection 存储着对象的集合&#xff0c;而 Map 存储着键值对(两个对象)的映射表。 1. 集合有哪些类&#xff1f; 集合是一组相关对象的容…

ThreadLocal底层源码解析

线程隔离&#xff0c;保证多线性访问安全 每个线程拿到的值私有&#xff0c;相互不干扰 ThreadLocal是JDK包提供的&#xff0c;它提供线程本地变量&#xff0c;如果创建一乐ThreadLocal变量&#xff0c;那么访问这个变量的每个线程都会有这个变量的一个副本&#xff0c;在实际…

跳槽? 我只想多赚点罢了

前言 五一过后也就也就意味着今年的金三银四跳槽季正式结束了&#xff0c;不知道大家是否拿到了offer&#xff0c;面对金三银四的招聘旺季&#xff0c;如果没有精心准备那笔者认为那是对自己不负责任&#xff1b;就我们测试员来说&#xff0c;多数的公司总体上面试都是以自我介…

表的存储原理(数据库)

目录 一、内部存储概述 二、 数据行&#xff08;记录&#xff09;结构 1、定长记录 2、变长记录 一、内部存储概述 表是有关某个特定实例的数据集合&#xff0c;在关系数据库中处于核心地位。 创建一个表&#xff0c;就会有一行或多行插入到用来管理这个表的多个系统表里。…

如何压缩照片大小不大于200k

如何压缩照片大小不大于200k&#xff1f;有时候需要压缩照片大小不大于200k是因为在一些场景下&#xff0c;上传或传输大文件会受到限制&#xff0c;例如通过电子邮件发送、上传到云存储空间等等。在这种情况下&#xff0c;压缩照片可以让图片更容易地传输和分享&#xff0c;并…

基于simulink进行音频波束成形系统的多核仿真

一、前言 此示例展示了 Simulink中的音频波束成形系统仿真模型如何使用数据流域提高性能。它使用 Simulink 中的数据流域自动将通信系统的数据驱动部分划分为多个线程&#xff0c;从而通过在桌面的多个内核上执行模拟来提高仿真的性能。 二、介绍 数据流执行域允许您在计算密集…

Docker Overlay2占用大量磁盘空间解决

问题 最近项目的jenkins编译时报错 FATAL: Unable to produce a script filejava.io.IOException: No space left on deviceat java.io.UnixFileSystem.createFileExclusively(Native Method)at java.io.File.createTempFile(File.java:2024)at hudson.FilePath$CreateTextTem…

#vue项目冗余请求处理#http://localhost:8080/sockjs-node/info?t=1683604231866

目录 前言一、为什么会出现这个请求&#xff1f;二、解决方法1.修改源码 总结 前言 提示&#xff1a;本文要记录的大概内容&#xff1a; 在我的vue项目中&#xff0c;开发环境下&#xff0c;一直重复发请求&#xff1a;http://localhost:8080/sockjs-node/info?t16836042318…

《花雕学AI》33:如何用XMind制作AI思维导图、鱼骨图和组织结构图

思维导图是一种有效的思维工具&#xff0c;它可以帮助我们整理信息&#xff0c;激发创意&#xff0c;提高效率。思维导图是一种以中心主题为核心&#xff0c;以分支结构为形式&#xff0c;以关键词和图像为内容的图形表示法。它可以让我们一目了然地看到知识的层次和逻辑&#…

手把手教你Vue+ECharts+高德地图API实现天气预报数据可视化

前言 所谓数据可视化&#xff0c;我们可以理解为从宏观角度来看一眼就能看出来整个数据的占比&#xff0c;走向。对于数据可视化&#xff0c;很多互联网公司是很看重这一块的&#xff0c;包括大厂&#xff1b;就比如阿里的淘宝&#xff0c;双十一的时候往往就需要将消费者的一…

论文浅尝 | 句法丰富的判别训练:一种有效的开放信息抽取方法

笔记整理&#xff1a;杜苗增&#xff0c;东南大学硕士&#xff0c;研究方向为多模态信息抽取 链接&#xff1a;https://aclanthology.org/2022.emnlp-main.401.pdf 动机 开放信息提取(OIE)是信息提取(IE)的一个分支&#xff0c;专注于从非结构化自然语言文本中提取结构化信息。…

论文笔记_2017_RS_迈向高清 3D 城市测绘:基于道路特征的移动测绘系统和航空影像配准

基本情况 出处&#xff1a;Javanmardi M, Javanmardi E, Gu Y, et al. Towards high-definition 3D urban mapping: Road feature-based registration of mobile mapping systems and aerial imagery[J]. Remote Sensing, 2017, 9(10): 975.原文地址&#xff1a;Remote Sensin…

Postman生成代码的小技巧

描述 你还在使用postman吗&#xff1f;你还是一条条复制参数吗&#xff1f;你还是手动录入数据吗&#xff1f;对于一些不经常使用postman的人来说&#xff0c;这个小技巧可以帮助你导入请求&#xff0c;以及转换成开发语言。 教程 1 抓包接口 以CSDN热榜为例&#xff0c;直…

数据可视化二、综合项目

零、文章目录 数据可视化二、综合项目 1、项目概述 &#xff08;1&#xff09;项目展示 &#xff08;2&#xff09;项目目的 市场需求&#xff1a;应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使…

Fiddler 微信小程序抓图教程(傻瓜式|汉化版|狗看了都直呼内行)

前言 本篇文章主要给大家详细讲解如何用Fiddler爬取微信小程序的图片&#xff0c;内容图文并茂&#xff0c;流程非常简单&#xff0c;我们开始吧。 目录 获取软件并打开点击工具设置相关代理如何抓图答疑总结 一、获取软件并打开 1、通过百度网盘下载获取安装包(链接是永久的…

二十三种设计模式第六篇--建造者模式(也叫生成器)

建造者模式&#xff08;Builder Pattern&#xff09;是使用多个简单的对象一步一步&#xff08;顺序构建&#xff09;构建成一个复杂的对象&#xff0c; 这种类型的设计模式属于创建型模式&#xff0c;他提供了一种创建对象的最佳方式。 一个Builder类会一步一步构建成为最终的…

Windows10 WIFI蓝牙图标消失,网卡驱动出现感叹号等无法上网的情况解决方案

Windows10出现WIFI蓝牙图标消失&#xff0c;网卡驱动出现感叹号等无法上网的情况解决方案_飞机跑不快的博客-CSDN博客 问题描述 我的电脑是戴尔游匣G15 5511&#xff0c;由于静电保护的原因&#xff0c;不得不拆开电脑后盖拔掉电池&#xff0c;释放静电&#xff0c;释放完成后…

OpenPCDet系列 | 6.PointPillars模型分类、回归、角度损失的构建

文章目录 模型损失计算1. 分类损失构建1.1 分类损失函数:SigmoidFocalClassificationLoss2. 回归损失构建2.1 回归损失函数:WeightedSmoothL1Loss3. 角度损失构建3.1 角度损失函数:WeightedCrossEntropyLoss4. 总结模型损失计算 在进行anchor的正负样本分配后,具体来说就是…