输入:一个字符串s
输出:最长的回文子串
规则:“abba"是一个回文
分析:输入是"babad”,输出"bab"。这个问题不能再按照之前分段的思路解决,或者说完全按照之前的思路。

之前的思路是:如果字符串只包含b,只包含ba,只包含bab…

因为要判断回文是要有以某个点为圆心的思想。最直观的感觉是从中间位置(n/2)开始判断。但思路没有进行下去。

如果已知"aba"是一个回文,那么"babab"也是一个回文。这是dp的核心逻辑。(怎么找到这个逻辑?)
令dp[i][j]=true,如果字符串从i到j是一个回文dp[i][j]=true,如果字符串从i到j是一个回文dp[i][j]=true,如果字符串从i到j是一个回文;dp[i][j]=false,如果字符串从i到j不是一个回文dp[i][j]=false,如果字符串从i到j不是一个回文dp[i][j]=false,如果字符串从i到j不是一个回文
如果s[i]=s[j]并且dp[i+1][j−1]=trues[i]=s[j]并且dp[i+1][j-1]=trues[i]=s[j]并且dp[i+1][j−1]=true,那么dp[i][j]=truedp[i][j]=truedp[i][j]=true
基本情况是:dp[i][i]=truedp[i][i]=truedp[i][i]=true,单个元素是回文;dp[i][i+1]=true,当s[i]=s[i+1]dp[i][i+1]=true,当s[i]=s[i+1]dp[i][i+1]=true,当s[i]=s[i+1],相邻元素相同。
吐槽:一般动态方程都是从dp[i-1]到dp[i],怎么会想到可以从dp[i+1]到dp[i]。
这段代码编写也会是难点。

 public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;int n = s.length();boolean[][] dp = new boolean[n][n];int maxlen = 1;int start = 0;for(int i=0;i<n;i++){dp[i][i] = true;if(i<n-1 && s.charAt(i)==s.charAt(i+1)){dp[i][i+1]=true;start = i;maxlen=2;}}for(int j=2;j<n;j++){for(int i=0;i<j;i++){if(dp[i+1][j-1] && s.charAt(i) == s.charAt(j)){dp[i][j]=true;if(j-i+1>maxlen){maxlen = j-i+1;start = i;}}}}return s.substring(start,start+maxlen);}

分析2:仍然是一种以某个点为中心的思想,一个回文字符串中心的点可能是一个,也可能是两个。会有2n-1个中心点。
例如"babad"。
以b为中心,ba为中心
以a为中心,以ab为中心
以b(第2位)为中心,以ba为中心

直到结束

 public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;int start = 0;int maxLen = 1;for(int i=0;i<s.length();i++){int len1 = expandAroundCenter(s,i,i);int len2 = expandAroundCenter(s,i,i+1);int len = Math.max(len1,len2);if(len>maxLen){start = i - (len-1)/2;maxLen = len;}}return s.substring(start,start+maxLen);}private int expandAroundCenter(String s ,int left,int right){while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)){left--;right++;}return right-left -1;}

分析3:Manacher 算法

public String longestPalindrome(String s) {if(s==null || s.length()==0) return s;char splitChar = '#';String str = changeString(s,splitChar);int n = str.length();int[] dp = new int[n];int max = 1;int middel = 1;for(int i=1;i<n;i++){int step = 0;int l = i-1;int r = i+1;while(l>=0 && r<n && str.charAt(l)==str.charAt(r)){l--;r++;step++;}dp[i] = step;if(step>max){max = step;middel = i;}}int start = (middel - max)/2;        return s.substring(start,start+max);}private String changeString(String s,char splitChar){StringBuilder str = new StringBuilder();str.append(splitChar);for(int i=0;i<s.length();i++){str.append(s.charAt(i));str.append(splitChar);}return str.toString();}

参考文章:link
link

[dp]Leetcode 5. Longest Palindromic Substring相关推荐

  1. 【回文串1 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring

    LeetCode 5. Longest Palindromic Substring LeetCode中与回文串相关的免费的题目共有15道(5, 9, 125, 131, 132, 214, 234, ...

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

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

  3. leetcode 5 :Longest Palindromic Substring 找出最长回文子串

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  4. [LeetCode]--5. Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  5. [*leetcode 5] Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  6. leetcode 5 Longest Palindromic Substring Java JavaScript解法

    题目详情 Given a string s, find the longest palindromic substring in s. You may assume that the maximum ...

  7. [LeetCode] 5. Longest Palindromic Substring

    这道题可以用动态规划,但是其实中心枚举更直接并符合逻辑,需要注意的是,以每一个字母为中心查找最大的Palindromic string的时候是有两种情况,第一种是以这个单一字母为中心(aba),第二个 ...

  8. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间

    题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...

  9. LeetCode 5.Longest Palindromic Substring 求解

    经典的动态规划问题 动态规划 定义: 是一种在数学.管理科学.计算机科学.经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法.        动态规划常常适用于有重 ...

最新文章

  1. 重新建立域计算机账户与域控制器的联系
  2. redis-cluster配置
  3. $(document).ready、body.Onload()和 $(window).load的区别
  4. Django Channels 入门指南
  5. 用 SAP ABAP 编写的俄罗斯游戏
  6. 华谊兄弟:实际控制人王忠军、王忠磊合计减持1.44%公司股份
  7. php火的原因,重燃你的PHP安全之火
  8. leetcode937.ReorderLogFiles
  9. 我所熟悉的网站负载均衡技术之硬件篇
  10. .5-浅析express源码之Router模块(1)-默认中间件
  11. C++ / vs 如何生成自己的静态库(lib)文件
  12. 秩和比综合评价法(RSR)详解及Python实现和应用
  13. Python -- 扫描局域网活跃IP
  14. 巨头卡位新房赛道,与贝壳、易居相比,房多多的底牌是什么?
  15. mac hdmi 外接显示器没声音
  16. archlinux 安装chrome浏览器
  17. websocket+kafka+springcloud+springboot实现报文(json)传输,解析,推送
  18. Bboss Elasticsearch 简单用法(ES 7.*)
  19. citrix应用程序虚拟化_在Citrix环境中部署和更新Microsoft Access应用程序
  20. 【GANs】Conditional Generative Adversarial Nets

热门文章

  1. windows 下安装Python easy_install 和pip
  2. maven编译项目时提示:cached in the local repository
  3. Error applying BeanValidation relational constraints错误的解决
  4. toj 3616 Add number (没想到啊~~)
  5. java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务
  6. 纯静态网站模板封装header和footer
  7. filter过滤器实现验证跳转_返回验证结果
  8. ORA-28000: the account is locked
  9. 什么是eager loading
  10. Z-Blog 爬虫 node实现