[dp]Leetcode 5. Longest Palindromic Substring
输入:一个字符串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 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring
LeetCode 5. Longest Palindromic Substring LeetCode中与回文串相关的免费的题目共有15道(5, 9, 125, 131, 132, 214, 234, ...
- LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)
Longest Palindromic Substring 最长回文子串 学习笔记 1. Brute method 第一种方法:直接循环求解,o(n2)o(n^2) class Solution:de ...
- leetcode 5 :Longest Palindromic Substring 找出最长回文子串
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...
- [LeetCode]--5. Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- [*leetcode 5] Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- leetcode 5 Longest Palindromic Substring Java JavaScript解法
题目详情 Given a string s, find the longest palindromic substring in s. You may assume that the maximum ...
- [LeetCode] 5. Longest Palindromic Substring
这道题可以用动态规划,但是其实中心枚举更直接并符合逻辑,需要注意的是,以每一个字母为中心查找最大的Palindromic string的时候是有两种情况,第一种是以这个单一字母为中心(aba),第二个 ...
- leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间
题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...
- LeetCode 5.Longest Palindromic Substring 求解
经典的动态规划问题 动态规划 定义: 是一种在数学.管理科学.计算机科学.经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重 ...
最新文章
- 重新建立域计算机账户与域控制器的联系
- redis-cluster配置
- $(document).ready、body.Onload()和 $(window).load的区别
- Django Channels 入门指南
- 用 SAP ABAP 编写的俄罗斯游戏
- 华谊兄弟:实际控制人王忠军、王忠磊合计减持1.44%公司股份
- php火的原因,重燃你的PHP安全之火
- leetcode937.ReorderLogFiles
- 我所熟悉的网站负载均衡技术之硬件篇
- .5-浅析express源码之Router模块(1)-默认中间件
- C++ / vs 如何生成自己的静态库(lib)文件
- 秩和比综合评价法(RSR)详解及Python实现和应用
- Python -- 扫描局域网活跃IP
- 巨头卡位新房赛道,与贝壳、易居相比,房多多的底牌是什么?
- mac hdmi 外接显示器没声音
- archlinux 安装chrome浏览器
- websocket+kafka+springcloud+springboot实现报文(json)传输,解析,推送
- Bboss Elasticsearch 简单用法(ES 7.*)
- citrix应用程序虚拟化_在Citrix环境中部署和更新Microsoft Access应用程序
- 【GANs】Conditional Generative Adversarial Nets
热门文章
- windows 下安装Python easy_install 和pip
- maven编译项目时提示:cached in the local repository
- Error applying BeanValidation relational constraints错误的解决
- toj 3616 Add number (没想到啊~~)
- java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务
- 纯静态网站模板封装header和footer
- filter过滤器实现验证跳转_返回验证结果
- ORA-28000: the account is locked
- 什么是eager loading
- Z-Blog 爬虫 node实现