题目描述
输入一个字符串Str,输出Str里最长回文子串的长度。
回文串:指aba、abba、cccbccc、aaaa这种左右对称的字符串。
串的子串:一个串的子串指此(字符)串中连续的一部分字符构成的子(字符)串
例如 abc 这个串的子串:空串、a、b、c、ab、bc、abc

Input
输入Str(Str的长度 <= 1000)
Output
输出最长回文子串的长度L。

Sample Input
daabaac
Sample Output
5

dp[i][j]表示S[i]至S[j]所表示的子串是否是回文子串,是则为1,不是为0。这样根据S[i]是否等于S[j],可以把转移情况分为两类:
①若S[i]=S[j],那么只要S[i+1]和S[j-1]是回文子串,S[i+1]至S[j-1]就是回文子串;如果S[i+1]至S[j-1]不是回文子串,则S[i]至S[j]一定不是回文子串。
②若S[i]!=S[j],那S[i]至S[j]一定不是回文子串。
由此可以写出状态转移方程

到这里还有一个问题没有解决,那就是如果按照i和j从小到大的顺序来枚举子串的两个端点,然后更新dp[i]lj],会无法保证dp[i + 1][ - 1]已经被计算过,从而无法得到正确的dp[i][i]。
如图11-4所示,先固定i=0,然后枚举j从2开始。当求解dp[0][2]时,将会转换为dp[1][],而dp[1][1]是在初始化中得到的;当求解dp[0][3]时,将会转换为dp[1][2], 而dp[1][2]也是在初始化中得到的;当求解dp[0][4]时,将会转换为dp[1][3], 但是dp[1][3]并不是已经计算过的值,因此无法状态转移。事实上,无论对ij和j的枚举顺序做何调整,都无法调和这个矛盾,因此必须想办法寻找新的枚举方式。
根据递推写法从边界出发的原理,注意到边界表示的是长度为1和2的子串,且每次转移时都对子串的长度减了1,因此不妨考虑按子串的长度和子串的初始位置进行枚举,即第一遍将长度为3的子串的dp值全部求出,第二遍通过第一遍结果计算出长度为4的子串的dp值…这样就可以避免状态无法转移的问题。如图11-5所示,可以先枚举子串长度L (注意: L是可以取到整个字符串的长度S.len()的),再枚举左端点i,这样右端点i+ L- 1也可以直接得到。

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<queue>
#include<math.h>
#include<set>
#define llu unsigned long long
using namespace std;int dp[1010][1010];
int main()
{string s1;int ans=1;getline(cin,s1);//cout << s1 << endl ;int n=s1.size();for(int i=0;i<n;i++){dp[i][i]=1;if(i<n-1){if(s1[i]==s1[i+1]){dp[i][i+1]=1;ans=2;}}}for(int L=3;L<=n;L++){for(int i=0;i+L-1<n;i++){int j=i+L-1;if(s1[i]==s1[j]&&dp[i+1][j-1]==1){dp[i][j]=1;ans=L;}}}cout << ans << endl ;return 0;
}

最长回文子串(C/C++动态规划)相关推荐

  1. 5. 最长回文子串——暴力法---动态规划解法---扩展中心法

    暴力法 动态规划解法 class Solution {public String longestPalindrome(String s) {if (s == null) return null;cha ...

  2. Leetcode-最长回文子串(包含动态规划以及Manacher算法)

    原文地址: https://www.cnblogs.com/mini-coconut/p/9074315.html 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000 ...

  3. 【字符串】最长回文子串 ( 动态规划算法 ) ★

    文章目录 一.回文串.子串.子序列 二.最长回文子串 1.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...

  4. 动态规划-最长回文子串

    输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: "cbbd" 输出 ...

  5. java最长回文子序列_LeetCode[5] - 最长回文子串动态规划

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: & ...

  6. 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串

    给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...

  7. leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  8. [Leedcode][JAVA][第5题][最长回文子串][数组][动态规划]

    [问题描述][第5题][最长回文子串][中等] 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1:输入: "babad" 输出: & ...

  9. 动态游标for循环_【【动图算法】(动态规划篇):最长回文子串

    本周继续做一道动态规划类型的题目,该题是阿里一面的一道算法题. [动图算法](动态规划篇):最长回文子串 leetcode 5 题:最长回文子串 https://leetcode-cn.com/pro ...

  10. [动态规划|字符串] leetcode 5 最长回文子串

    [动态规划|字符串] leetcode 5 最长回文子串 1.题目 题目链接 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例1: 输入: "b ...

最新文章

  1. FPGA之道(28)VHDL的并行语句
  2. 20项任务横扫BERT!CMU谷歌发布XLNet,NLP再迎屠榜时刻
  3. python面试题及答案-Python 45道基本面试题及答案 (新手非常有用)
  4. zabbix3.0.4 部署之一 (简介)
  5. 破解制造业困局:从实际案例看制造业如何缩短订单交付周期?
  6. 博士申请 | 澳大利亚悉尼科技大学招收人工智能/软件工程方向全奖博士生
  7. RKNN Toolkit使用教程
  8. Vert.x入坑须知(2)
  9. 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis...
  10. JavaScript数据类型之typeof检测变量数据类型(5)
  11. 高等代数第3版下 [丘维声 著] 2015年版_黄哥友情提示:学习线性代数的书和视频...
  12. 为WIN7原生2019版ISO更改为中文
  13. 找到投资人的几种途径和方法
  14. 什么是企业移动化?以及企业移动化的4大特征
  15. 人的一生,到底在追求什么呢?
  16. HTML中添加超链接、音频标签、视频标签、内嵌框架标签
  17. PLC可编程控制器控制热水供暖循环系统实训
  18. 【纯净安装、免U盘】无视win11硬件要求,直接setup.exe安装win11
  19. MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能...
  20. A005 C++提高编程

热门文章

  1. 大数据技术原理与应用作业七
  2. 回馈社会 初志企业文化践行月活动顺利开展
  3. Gps车辆监控软件平台开发技术精华
  4. Android开发:申请微信AppID的MD5(数字签名)格式bug
  5. wps使用xml文件显示ui
  6. 分享:Guacamole 0.7.1 发布,基于Web的VNC客户端
  7. @NotNull、@NotEmpty、@NotBlank区别
  8. 【翻译】为什么你需要一个API网关来管理对你的API的访问?
  9. 科技战“疫”直播第二期!人工智能在金融机构反洗钱的应用
  10. python自动写作ai_论文自动写作之自动添加参考文献