区间动态规划——最长回文子串(C++)

难得心静。

——2024年6月30日


  什么是区间动态规划?

        区间动态规划通常以连续区间的求解作为子问题,例如区间 [i, j] 上的最优解用dp[i][j]表示。先在小区间上进行动态规划得到子问题的最优解,再利用小区间的最优解合并产生大区间的最优解
        所以区间动态规划一般需要从小到大枚举所有可能的区间,在枚举时不能向平常的从头到尾遍历,而是以区间长度len为循环变量,在不同的区间长度中枚举所有的可能状态,并从中选取最优解。

区间动态规划区别于一般的动态规划:以区间长度len作为循环变量。 


下面以LeetCode5最长回文子串为例:

LeetCode5——最长回文子串

题目描述

        给定一个字符串s(s仅由数字和英文大小写字母组成,长度为1~1000),求s中最长的回文子串。例如,s = “babad”,最长的回文子串有“bab”和“aba”,求出任意一个均可。

题解思路

        区间动态规划

1. 定义dp数组

        定义 dp[i][j ]表示 s[i...j] 是否为回文子串,dp的数值用true和false表示。例如 s = “aba”,那么dp[0][2] = true,dp[0][1] = false;

动态规划的问题,dp的含义都是自己给的,给出含义之后就需要去列关系求解了。

2. 确定dp限制条件

注:len表示字符串长度

        ①对于任何 len == 1 的字符串,dp[i][j] = 1

        ②对于任何 len == 2 的字符串,dp[i][j] = (s[i] == s[j]);(如果s[i] == s[j], 说明该长度为2的字符串是回文串,比如说“aa”)

        ③对于任何 len  ≥  3 的字符串, dp[i][j] = (dp[i+1][j-1] && s[i] == s[j])

解释如下:

        第一种情况很好理解,如果字符串长度为1的话,那么他一定是回文子串;

        第二种情况也很好理解,如果字符串长度为2,那么只需要判断这两个字符是否相等即可,如果相等则为回文子串,反之则不是;

        第三种情况,字符串长度不小于3时,你就需要想到你定义的dp含义和回文字符串的性质了,dp[i][j ]表示 s[i...j] 是否为回文子串要判断s[i...j]是否为回文子串,那么就必须先知道s[i+1...j-1]是否为回文子串,然后再判断s[i]是否等于s[j],两者都满足的话那dp[i][j]就等于true了,只要有一个不满足,那么dp[i][j]就为false。

Tips

        前两种情况是小区间的最优解,第三种情况就是大区间的最优解。

        其实动态规划的问题本质上就是求取了子问题的最优解之后,不断根据子问题的值更新当前dp数组的值,比如非常经典的背包问题。

3. 更新目标字符串长度

        不断更新目标字符串长度,只要出现 dp[i][j]=true 的情况就进行更新,并利用substr函数打印即可。(这里如果不理解请看代码部分) 


 代码实现

再次提醒:区间动态规划的特点是以len为循环变量

区间动态规划伪代码:

for(int len = 1; len <= 序列长度; len++){
    for(int i = 0; i + len - 1 < 序列长度; i++){
        int j = i + len - 1;
        i和j就是区间的端点,i与j相距len个长度。
    }
}

关键代码:

// 获取最长回文子串
string getLongestStr(string s){
    int n = s.size();
    string ans = "";
    // 定义dp数组
    // dp[i][j]表示从i到j的子字符串是否为回文串
    vector<vector<bool>> dp(n, vector<bool> (n, false));

    // len从1开始
    for(int len = 1; len <= n; len++){
        for(int i = 0; i + len - 1 < n; i++){
            int j = i + len - 1;
            if(len == 1){
                dp[i][j] = true;
            }
            else if(len == 2){
                dp[i][j] = (s[i] == s[j]);
            }
            else{
                dp[i][j] = (s[i] == s[j] && dp[i+1][j-1]);
            }
            if(dp[i][j] && ans.size() < len){
                ans = s.substr(i, len);//更新回文子串
            }
        }
    }
    return ans;
}

结果展示

 

完整代码

// 区间动态规划
#include<iostream>
#include<vector>
#include<string>

using namespace std;

// 获取最长回文子串
string getLongestStr(string s){
    int n = s.size();
    string ans = "";
    // 定义dp数组
    // dp[i][j]表示从i到j的子字符串是否为回文串
    vector<vector<bool>> dp(n, vector<bool> (n, false));

    // len从1开始
    for(int len = 1; len <= n; len++){
        for(int i = 0; i + len - 1 < n; i++){
            int j = i + len - 1;
            if(len == 1){
                dp[i][j] = true;
            }
            else if(len == 2){
                dp[i][j] = (s[i] == s[j]);
            }
            else{
                dp[i][j] = (s[i] == s[j] && dp[i+1][j-1]);
            }
            if(dp[i][j] && ans.size() < len){
                ans = s.substr(i, len);
            }
        }
    }
    return ans;
}



int main(){
    string s;
    cout<<"请输入字符串s:";
    cin>>s;
    cout<<"最长回文子串为"<<getLongestStr(s)<<endl;
    return 0;
}

         看完了是否意犹未尽呢,那再把这个题变一下 ,我现在想求最长回文子序列(或者它的长度)应该怎么做?题目解释:比如我有一个字符串为:s = “aferegga”,那它的最长回文子序列为“aerea”,它的长度为5。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

娱乐圈发生震动,AI大模型技术已经取代了SNH48的小偶像?

自2023年以来&#xff0c;全球都被包裹在AI的惊天大潮之中&#xff0c;所有行业都在主动或被动地迎接改变。目前&#xff0c;各行业已经有大量公司正在把AI作为自身发展的最佳路径。其中&#xff0c;娱乐行业作为最被人们熟知的行业也在面对AI的发展时&#xff0c;发生着巨大变…

视频共享融合赋能平台LntonCVS统一视频接入平台数字化升级医疗体系

医疗健康事关国计民生&#xff0c;然而&#xff0c;当前我国医疗水平的地区发展不平衡、医疗资源分布不均和医疗信息系统老化等问题&#xff0c;制约了整体服务能力和水平的提升。视频融合云平台作为推动数字医疗的关键工具&#xff0c;在医疗领域的广泛应用和普及&#xff0c;…

统计信号处理基础 习题解答11-1

题目 观测到的数据具有PDF 在μ给定的条件下&#xff0c;是相互独立的。均值具有先验PDF&#xff1a; 求μ的 MMSE 和 MAP 估计量。另外&#xff0c;当和时将发生什么情况? 解答 和两者都是独立高斯分布&#xff0c;与例题10.1一致&#xff0c;直接套用&#xff08;10.11&am…

RedisAtomicInteger并发案例

&#x1f370; 个人主页:__Aurora__ &#x1f35e;文章有不合理的地方请各位大佬指正。 &#x1f349;文章不定期持续更新&#xff0c;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ RedisAtomicInteger 提供了对整数的原子性操作&a…

《昇思25天学习打卡营第14天 | 昇思MindSpore基于MindNLP+MusicGen生成自己的个性化音乐》

14天 本节学了基于MindNLPMusicGen生成自己的个性化音乐。 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量的音乐样本。 MusicGen模型基于Transformer结构&#xff0c;可以分解为三个不同的阶段…

C++: 如何用C语言实现C++的虚函数机制?

前言 在 googletest的源码中&#xff0c;看到gtest-matchers.h 中实现的MatcherBase 类自定义了一个 VTable&#xff0c;这种设计实现了一种类似于C虚函数的机制。C中的虚函数机制实质上就是通过这种方式实现的&#xff0c;本文用c语言自定义虚函数表VTable实现了一下virtual的…

等保主机测评防骗指南(资产调研)

你是否测评时常被运维给忽悠&#xff1f;是否觉得以下的对话耳熟&#xff1f; 你&#xff1a;您好&#xff0c;请问你们的主机资产有哪些&#xff0c;包括服务器、数据库、中间件、应用系统等。 甲&#xff1a;我们资产就这两台服务器&#xff0c;数据库什么的都这上面&#…

OpenGL3.3_C++_Windows(25)

阴影失真:阴影的不真实感 条纹样式&#xff1a; 首先理解采样原理&#xff1a;同光的视角下&#xff0c;渲染一张深度图&#xff0c;每个像素&#xff0c;存储同一射线下的深度值&#xff08;不断更新深度缓冲的结果&#xff09;&#xff0c;即最近片段的深度。接着&#xff0…

hadoop词频统计

1 Hadoop 安装与伪分布的搭建 2 Hadoop词频统计 此文章基于搭建好hadoop之后做的词频统计实验&#xff0c;以上是链接为搭建hadoop的教程 目录 1 HDFS 文件系统常用命令 2 词频统计实验准备工作 2.1 启动hadoop 关闭防火墙 2.2 查看图形化界面 2.3 文件上传 3 词频统计…

isspace()方法——判断字符串是否只由空格组成

自学python如何成为大佬(目录): https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isspace()方法用于判断字符串是否只由空格组成。isspace()方法的语法格式如下&#xff1a; str.isspace() 如果字符串中只包含空格&…

【Unity设计模式】✨使用 MVC 和 MVP 编程模式

前言 最近在学习Unity游戏设计模式&#xff0c;看到两本比较适合入门的书&#xff0c;一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 这两本书介绍了大部分会使用到的设计模式&#xff0c;因此很值得学习 本…

【算法】5分钟了解如何使用PCA主成份分析

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是PCA1.1.PCA的思想1.2.PCA的数学表示 二、什么是PCA的主成份与方差2.1.主成份的方差2.2.主成份的命名 三、如何使用PCA3.1.主成份的代码实现 主成份分析全称为PCA Principle Component Analysis ,它的主…

Linux虚拟串口设置

VSPD虚拟串口软件安装及使用 一、软件安装 1、Configure Virtual Serial Port Driver(VSPD) 1.1 首先下载 Configure Virtual Serial Port Driver(VSPD) 软件 链接&#xff1a;https://pan.baidu.com/s/11aGc2aHGUew5QZ0XhaWXJw 提取码&#xff1a;rmd7 1.2 安装时注意将…

计算机基础之汇编语言学习笔记

学习来源&#xff1a;b站各种学习资料 前置知识&#xff1a;计算机组成原理等知识 学习参考的资源 汇编语言编程的速成指南[上]~从零开始的期末抢救计划 &#xff08;8086汇编&#xff09;_哔哩哔哩_bilibili 链接: https://pan.baidu.com/s/1tg_ZW7VD3TS_s1v_EjS89w?pwdak6…

2029年AI服务器出货量将突破450万台,AI推理服务器即将爆发式增长

在2020年&#xff0c;新冠疫情与远程办公模式的兴起推动了所有类型服务器的出货量达到峰值&#xff0c;随后几年里&#xff0c;除了AI服务器之外的所有类别都回归到了正常水平。 根据Omdia的研究数据&#xff0c;AI服务器的出货量在2020年急剧上升&#xff0c;并且至今未显示出…

运筹系列93:VRP精确算法

1. 基础版本 定义 x i j k x_{ijk} xijk​为边 i j ij ij是否由车辆 k k k去运输。如果有时间窗约束的话&#xff0c;再加上一个变量 c i k c_{ik} cik​即可&#xff0c;表示第k辆车到达节点i时的时间点。 第一类客户流量约束&#xff0c;要求每个点都有1个入度和1个出度&…

ios13多窗口(UIWindowScene)学习笔记

ios13引入了UIWindowScene类、UIWindowSceneDelegate协议以便支持多窗口功能&#xff0c;但其适用于ipad&#xff0c;不适用于iphone&#xff0c;因为iphone不支持多窗口功能。注意&#xff0c;这里说的窗口不是UIWindow&#xff0c;而是UIWindowScene。 ios13前后的app的UI架…

AI陪伴产品的情感设计:从孤独感到恋爱感评分:9/10

本文主要阐述三个话题&#xff1a; 1. 市面上有哪些AI陪伴产品&#xff1f; 2. 我们团队要怎么做&#xff1f; 3. 为什么要做&#xff1f; 市面上有哪些陪伴类产品&#xff1f; Role-play&#xff08;角色扮演&#xff09; 在当前市场上&#xff0c;有不少以角色扮演为核心的…

Wails 安装初体验

文章目录 Wails 安装说明1. 系统要求2. 安装步骤3. 构建应用 结论 Wails 安装说明 Wails 是一个用于构建桌面应用的 Go 框架&#xff0c;结合了现代前端技术。以下是安装步骤&#xff1a; 1. 系统要求 Go 1.16 或更高版本Node.js 和 npm可选&#xff1a;适用于 Windows、mac…

iconfont-阿里巴巴矢量图标库 在vue项目使用记录

官网地址&#xff1a;https://www.iconfont.cn/manage/index?manage_typemyprojects&projectId4539761 第一步&#xff1a; 下载资源 ->解压到项目文件夹 第二步 在项目中main.ts 或者main.js 引入资源 import //assets/iconfont/font/iconfont.js; import //assets…