【动态规划刷题 17】回文子串&& 最长回文子串

简介: 【动态规划刷题 17】回文子串&& 最长回文子串

647. 回文子串

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

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

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

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

示例 1:

输入:s = “abc”

输出:3

解释:三个回文子串: “a”, “b”, “c”

示例 2:

输入:s = “aaa”

输出:6

解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

解法(动态规划):

算法思路:

我们可以先「预处理」⼀下,将所有⼦串「是否回⽂」的信息统计在 dp 表⾥⾯,然后直接在表⾥⾯统计 true 的个数即可。

1.状态表示*

为了能表⽰出来所有的⼦串,我们可以创建⼀个 n * n 的⼆维 dp 表,只⽤到「上三⻆部分」

即可。

其中, dp[i][j] 表⽰: s 字符串 [i, j] 的⼦串,是否是回⽂串。

2.状态转移方程

当 s[i] != s[j] 的时候:不可能是回⽂串, dp[i][j] = 0 ;

当 s[i] == s[j] 的时候:根据⻓度分三种情况讨论:

• ⻓度为 1 ,也就是 i == j :此时⼀定是回⽂串,dp[i][j] = true ;

• ⻓度为 2 ,也就是 i + 1 == j :此时也⼀定是回⽂串, dp[i][j] =true ;

• ⻓度⼤于 2 ,此时要去看看 [i + 1, j - 1] 区间的⼦串是否回⽂: dp[i][j]= dp[i + 1][j - 1] 。

综上,状态转移⽅程分情况谈论即可。

3. 初始化

因为我们的状态转移⽅程分析的很细致,因此⽆需初始化。

4. 填表顺序

根据「状态转移⽅程」,我们需要「从下往上」填写每⼀⾏,每⼀⾏的顺序⽆所谓

5. 返回值

根据「状态表⽰和题⽬要求」,我们需要返回 dp 表中 true 的个数

代码:

 int countSubstrings(string s) {
           int n=s.size();
        vector<vector<int>> dp(n,vector<int>(n));
        dp[0][0]=1;
        int sum=1;
        for(int j=1;j<n;j++)
        {
            for(int i=0;i<=j;i++)
            {
                if(s[j]==s[i])
                {
                    if(j==i||j==i+1) dp[i][j]=1;
                    if(j-i>1)
                    {
                        dp[i][j]=dp[i+1][j-1];
                    }
                }
                if(dp[i][j]) sum++;
            }
        }
        return sum;
    }

a16b27a5151646a885f505d61fd5b008.png

5. 最长回文子串

链接: 5. 最长回文子串

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

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

示例 1:

输入:s = “babad”

输出:“bab”

解释:“aba” 同样是符合题意的答案。

示例 2:

输入:s = “cbbd”

输出:“bb”

解法思路:

a. 我们可以先⽤ dp 表统计出「所有⼦串是否回⽂」的信息

b. 然后根据 dp 表⽰ true 的位置,得到回⽂串的「起始位置」和「⻓度」。 那么我们就可以在表中找出最⻓回⽂串。

关于「预处理所有⼦串是否回⽂」,已经在上⼀道题⽬⾥已经讲解过了。

代码:

  string longestPalindrome(string s) {
        int n=s.size();
        vector<vector<int>> dp(n,vector<int>(n));
        dp[0][0]=1;
        int sum=1;
        string ret(1,s[0]);
        for(int j=1;j<n;j++)
        {
            for(int i=0;i<=j;i++)
            {
                if(s[j]==s[i])
                {
                    if(j==i||j==i+1) dp[i][j]=1;
                    if(j-i>1)
                    {
                        dp[i][j]=dp[i+1][j-1];
                    }
                }
                if(dp[i][j])
                {
                    if(j-i+1>sum)
                    {
                        sum=j-i+1;
                        string tmp(s.begin()+i,s.begin()+j+1);
                        ret=tmp;
                    }
                }
            }
        }
        return ret;
    }

66c35113990d4f6db009b5176c93a4b2.png


相关文章
|
小程序 JavaScript Android开发
【经验分享】如何在支付宝小程序里玩转富文本功能
【经验分享】如何在支付宝小程序里玩转富文本功能
1262 6
|
存储 运维 负载均衡
分区存储
分区存储
521 0
|
7月前
|
人工智能 监控 安全
OpenClaw多Agent团队搭建实战手册:(阿里云/本地保姆级部署+免费大模型API配置+避坑指南)
2026年,AI工具的竞争已从“对话能力”升级为“执行效率”。大多数人用AI仍停留在“你问我答”的高级搜索阶段,而真正的生产力飞跃,来自能“自主闭环”的AI执行系统——OpenClaw作为首个开源本地部署的AI Agent平台,彻底打破这一局限。
1819 171
|
7月前
|
前端开发 JavaScript Java
Web化智慧PACS系统源码 (纯B/S架构)
本套Web PACS源码,纯浏览器秒级调阅CT/MR/DR/超声等多模态影像;内置专业Web Viewer,支持MPR/MIP/VR三维重建、精准测量与RIS全流程管理,助医疗企业零成本打造云PACS及区域影像中心。
|
9月前
|
人工智能 C++
【AI大模型面试宝典五】- 基础架构篇
【AI大模型面试宝典】深入解析归一化技术:LayerNorm、RMSNorm原理与应用,Pre-norm vs Post-norm对比,助力掌握大模型训练稳定与加速收敛核心要点。高频考点+实战解析,轻松拿下offer!点赞关注,持续更新~ #大模型面试 #归一化
384 0
|
10月前
|
缓存 监控 JavaScript
Vue项目性能优化实战:从编码到部署的全链路优化方案
本文系统梳理Vue项目从编码到部署的全链路性能优化方案,涵盖组件设计、响应式优化、构建压缩、CDN加速、运行时监控等关键环节,结合实战代码,助力提升页面加载速度与交互流畅度。
502 0
|
JSON 前端开发 NoSQL
如何开发OA管理系统的日报、周报管理板块?(附架构图+流程图+代码参考)
本文详解如何将日报/周报模块深度集成至人事OA系统,涵盖需求分析、系统架构、数据模型、业务流程、开发技巧及运维部署等全流程方案。重点阐述结构化数据采集、自动化提醒、审批闭环设计等核心功能,并提供关键代码示例,助力企业高效落地日报/周报系统,提升组织协同效率。
|
存储 JavaScript 前端开发
js中的遍历方法比较:map、for...in、for...of、reduce和forEach的特点与适用场景
js中的遍历方法比较:map、for...in、for...of、reduce和forEach的特点与适用场景
1034 0
|
存储 物联网 数据库
App Inventor 2 低功耗蓝牙 BlueToothLE 拓展中文文档(完整翻译加强版)
低功耗蓝牙,也称为蓝牙LE 或简称 BLE,是一种类似于经典蓝牙的新通信协议,不同之处在于它旨在消耗更少的功耗和成本,同时保持同等的功能。 因此,低功耗蓝牙是与耗电资源有限的物联网设备进行通信的首选。
1320 2
|
文字识别 并行计算 JavaScript
PaddleOCR + Django 实现一个OCR在线识别网站,一起来玩呀
除了PaddleOCR之外,之前还介绍过一些其它好玩的开源项目,例如老照片修复 Bringing-Old-Photos-Back-to-Life 、黑白照片上色DeOldify 。因此,最近准备启动一个项目,做一个在线网站,将之前一些好玩的功能都陆续集成在这个网站中
PaddleOCR + Django 实现一个OCR在线识别网站,一起来玩呀

热门文章

最新文章