给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”

链接:leetcode原题

思路分析:

这题是区间dp经典题目。
先来看看回文子串的定义:
长度为1:a, b. 单个字符就是一个回文串
长度为2:aa, bb. 两个相同的字符就是一个回文串
长度为3:aba, dad.
长度为4:abba, daad.
长度为5:abcba, dacad.
我们可以定义两个状态i, j表示区间[i,j]. 令dp[i][j]表示区间[i,j]是否是回文子串。
可以发现,dp初始状态在长度为1,2的条件。当长度>2时,若s[i] == s[j],则dp[i][j] = dp[i+1][j-1]. 也就是说,只要s[i] == s[j],并且区间[i+1,j-1]是回文串,那么区间[i,j]就是回文串。比如aba,s[0] == s[2] == ‘a’,中间的b(dp[1][1])是回文串,于是aba是回文串。又比如abba,s[0] == s[3],dp[1][2]是回文串,那么abba就是回文串。
那么我们就可以验证该状态转移方程是正确的了。

接下来就是写递推。我们需要初始化长度1,长度2的回文串,长度3的回文串由长度1推出,长度4的回文串由长度2推出,长度5的回文串由长度3推出…
于是第一层for循环是长度[3,n]递推。
那么第二层for循环便是遍历区间的起点。
区间的终点 = 区间起点+区间长度-1.
两层for循环,时间复杂度O(n^2).
由于长度是递增的递推,因此我们只需要在满足回文串的条件下更新最大长度maxLen,就可以得到最长的回文子串长度。
下面上代码:

class Solution {public:int dp[1010][1010];string longestPalindrome(string s) {memset(dp,0,sizeof(dp));    int n = s.length();int l = 0, maxLen = 1;for(int i = 0;i < s.length();i++)   //初始化{dp[i][i] = 1;    //长度为1,自身就是回文串if(s[i] == s[i+1] && i+1 < n)   //两个相同字符组成长度为2的回文串dp[i][i+1] = 2, l = i, maxLen = 2;}for(int len = 3;len <= n;len++) //区间长度递推{for(int i = 0;i+len-1 < n;i++)  //区间起点枚举{int j = i+len-1; //区间终点if(s[i] == s[j] && dp[i+1][j-1])   //满足回文串条件{dp[i][j] = 1;    //定义区间[i,j]为回文串l = i, maxLen = len;   //更新区间起点和长度}}}return s.substr(l,maxLen);}
};

【leetcode】最长回文子串(区间dp)相关推荐

  1. leetcode 5-最长回文子串(中心扩展算法)

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

  2. leetcode 最长回文子串

    103 / 103 个通过测试用例 状态:通过 执行用时:8 ms 内存消耗:36.3 MB 提交时间:6 月,3 周之前 class Solution {public String longestP ...

  3. LeetCode 5. 最长回文子串(动态规划)

    文章目录 1. 题目 2. 解题 2.1 自己写的DP 2.2 优化后的DP 2.3 中心扩展法 1. 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. ...

  4. LeetCode 647. 回文子串(DP/中心扩展)

    文章目录 1. 题目 2. 解题 2.1 动态规划 2.2 中心扩展法 1. 题目 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组 ...

  5. 动态规划——最长回文子串(Leetcode 5)

    题目选自Leetcode 5 最长回文子串 力扣解题代码: class Solution { public:string longestPalindrome(string s) {int len=s. ...

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

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

  7. leetcode(5)—— Longest Palindromic Substring(最长回文子串)

    longest-palindromic-substring 法1:暴力搜索(但会超时) 遍历全部子串(n+(n−1)+-+1=n(1+n)2n+(n-1)+\ldots+1=\frac{n(1+n)} ...

  8. LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)

    Longest Palindromic Substring 最长回文子串 学习笔记 1. Brute method 第一种方法:直接循环求解,o(n2)o(n^2) class Solution:de ...

  9. Leetcode——回文子串 / 最长回文子串 / 最长回文子序列

    1. 回文子串 (1)中心扩展 比如对一个字符串 ababa,选择最中间的 a 作为中心点,往两边扩散,第一次扩散发现 left 指向的是 b,right 指向的也是 b,所以是回文串,继续扩散,同理 ...

最新文章

  1. 腾讯再次海选AI项目,1500进40,医疗零售机器人成新风向
  2. Ignite Web 控制台(使用官方免费部署的控制台)
  3. 组件kdsvrmgr无法正常工作_汽轮机润滑油冷油器六通阀的工作原理及现阶段存在的问题...
  4. DotNet4应用程序打包工具(把DotNet4安装程序打包进你的应用程序;WINAPI开发,无dotNet环境也可顺利执行)【一】整体思路...
  5. 《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.5节光照的每顶点计算与每片元计算...
  6. mysql 从库状态_大神教你自动发现监控mysql从库状态
  7. canal布在mysql端还是服务端_canal使用入坑,亲测 !!!!
  8. Centos下载离线包、安装离线包、删除现有包、是否安装(rpm)
  9. 探寻 Redis 内存诡异增长的元凶
  10. 随记(五)--上传图片耗时问题
  11. 时间序列经济python_(13)Python初入坑之时间序列基础内容
  12. 用户奖励体系有哪些反作弊的机制?
  13. python调用caffe环境配置
  14. NUXT.JS原理简述
  15. 英寸和厘米的交互python_Python / PyQt4:如何找到显示器的尺寸(以英寸为单位)?...
  16. 苹果笔记本摄像头Linux驱动,苹果发布Macbook摄像头驱动更新 更适配window10
  17. c语言自学书籍 新闻,如何学习C语言
  18. 好用、好玩的小程序第二弹,统统学会,新技能get
  19. Python爬虫:爬取必应壁纸(可直接运行)
  20. 《狂人日记》是中国第一部现代白话文小说

热门文章

  1. linux查看目录acl权限,ACL权限详解
  2. js 的 forEach()函数
  3. RS485/RS232串口通信实现源码
  4. 视频号未来发展趋势怎样,运营中都有哪些技巧丨国仁网络资讯
  5. Asterisk MeetMe的配置
  6. 外国人申请签证和居留许可须知
  7. oracle中in和between的区别,in between与between 的用法区别
  8. React Native App版本升级方案解析
  9. What is a Lightweight Methodology? 什么是轻量级方法?(英汉对照)
  10. openharmony学习