问题描述

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

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

解法

思路很简单,首先想到若情况为回文字符串奇数个字符时,中间的字符为轴。比较两边的字符是否相同。当回文串字符为偶数时,刚开始假想它以空气为轴,则找不到其他字符的下标。于是想到在每个字符包括两边都插入一个特殊字符比如(),这样构成的回文字符串一定是奇数长度。也就是一定存在中间的某个字符,使得两边以它(可能是特殊字符也可能原字符串中的字符)为轴,并且此字符串的两边都以结尾。

public static void longestPalindrome(String s) {//在每两个字符中间插入特殊字符,保证回文字符串一定是奇数长度String str=s.replace("", "*");int maxl=1;int index=0;//从左到右遍历,寻找以每一个字符为轴的最大长度for(int i=1;i<str.length();i++) {if(maxl<=2*Math.min(i,str.length()-i-1)+1) {//两边的长度可以超过最大长度for(int j=1;;j++) {if(j<=i&&j<=str.length()-i-1) {//两边的长度可以取到的值if(str.charAt(i-j)!=str.charAt(i+j)) {//这一个字符不是回文串中的int l=2*j-1;if(maxl<l) {maxl=l;index=i;}break;}}else {//到头了都是回文串int l=2*j-1;if(maxl<l) {maxl=l;index=i;}break;}}}}//得到字符串StringBuilder sb=new StringBuilder();for(int i=index+1-(maxl-1)/2;i<=index-1+(maxl-1)/2;i++) {if(i%2!=0) {sb.append(str.charAt(i));}}}

结果

官方解法

方法一 动态规划

使用P[i][j]表示Si到Sj是否是一个回文串。
动态规划转移方程可以写为P[i][j]=P[i+1][j-1]&Si,即先看中间再加上首尾两端。
边界条件:因为单个的字符为回文串,P[i][i]=true,两个相邻的相同字符为回文串if Si==Si+1则P[i][i+1]=true
根据这个思路我自己写了一个代码。跑出来的效果很差。

public static String longestPalindrome(String s) {if(s==null||s.isEmpty())return "";boolean[][]P=new boolean[s.length()][s.length()];//边界int length=1;int start=0,end=0;for(int i=0;i<s.length()-1;i++) {if(s.charAt(i)==s.charAt(i+1)) {P[i][i+1]=true;if(length<2) {length=2;start=i;end=i+1;}}P[i][i]=true;}P[s.length()-1][s.length()-1]=true;//for(int i=0;i<s.length()-2;i++) {for(int j=0;j<s.length()-i-2;j++) {if(P[j+1][j+i+1]&&s.charAt(j)==s.charAt(j+i+2)) {P[j][i+j+2]=true;int l=i+3;if(length<l) {length=l;start=j;end=i+j+2;}}}}s=s.substring(start, end+1);return s;}

方法二 中心扩展

方法二的本质即为:我们枚举所有的「回文中心」并尝试「扩展」,直到无法扩展为止,此时的回文串长度即为此「回文中心」下的最长回文串长度。这个算法思想与我的很相似。但是跑出来的效果比我好。

class Solution {public String longestPalindrome(String s) {if (s == null || s.length() < 1) return "";int start = 0, end = 0;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 > end - start) {start = i - (len - 1) / 2;end = i + len / 2;}}return s.substring(start, end + 1);}private int expandAroundCenter(String s, int left, int right) {int L = left, R = right;while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {L--;R++;}return R - L - 1;}
}

方法三 Manacher算法

Leetcode之最长回文子串相关推荐

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

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

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

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

  3. 20200118:(leetcode)最长回文子串(中心扩展算法详解及思考)

    最长回文子串(中心扩展算法详解及思考) 题目 中心扩展算法详解 代码实现 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: " ...

  4. 20200117:(leetcode)最长回文子串(暴力法)

    最长回文子串 题目 基本思路 代码实现 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: ...

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

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

  6. leetcode - 5. 最长回文子串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 解题思路: 对于一个字符串,回文子串存在两种情况,第一种情况是???a???的回文子串,第二种情况是???aa ...

  7. leetcode题解5-最长回文子串

    问题描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同 ...

  8. LeetCode 516 最长回文子串

    思路: 动态规划 dp数组:dp[i][j]表示s[i:j]最长回文子串长度 出口: ●i j相同,   dp[i][j]  都为1 ●j=i+1,如果  s[j]=s[i]  dp[i][j]=2, ...

  9. LeetCode 05最长回文子串

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

  10. [LeetCode][M0005]最长回文子串(Java)(马拉车(Manacher)算法)

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

最新文章

  1. 03-dispatch_after
  2. 比 Spring Boot 快 10 倍的 Bootique 框架
  3. ubuntu18+Eclipse+CDT开发QT5界面程序
  4. java 中的点_java————形参中的点点点 | 学步园
  5. Student学生管理系统
  6. adb server is out of date. linux,adb server is out of date. killing完美解决
  7. 理想制动力分配曲线matlab源代码_宝马进入“血拼”状态,动力倍儿棒
  8. linux 查看进程启动路径
  9. [Java] 1031. Hello World for U (20)-PAT甲级
  10. ubuntu 安装GPU黑屏 修改GRUB_安装Ubuntu 18.04系统的相关注意事项,及解决Ubuntu 双系统黑屏问题...
  11. 思维导图——史上最详细的计算机基础进制转换讲解
  12. 杭电 2037 经典贪心
  13. java分发_【Java】用注解实现分发器
  14. Mac电脑没声音了怎么办?
  15. 【数据集】人工智能领域比较常见的数据集汇总
  16. html正方形符号,HTML特殊字符显示
  17. 零基础想学大数据?别急!先搞清这一点
  18. 基于opencv和pillow实现人脸识别系统(附demo)
  19. 彩色图片变成黑白打印风格图片的一种方式
  20. 【数据结构】_树与二叉树

热门文章

  1. es6 class super关键字
  2. sql server 2012 复制数据库向导出现TransferDatabasesUsingSMOTransfer()异常
  3. Python 字典 get() 方法
  4. typeof和instanceof的用法
  5. 手把手教你做关键词匹配项目(搜索引擎)---- 第十一天
  6. C#中的换行符、回车
  7. Objective-C 日记② 关于self用法
  8. [转]NHibernate:many-to-one/one-to-many/many-to-many关系映射
  9. 拓端tecdat|用R语言模拟随机服务排队系统
  10. 城市间紧急救援 (25 分)(Dijkstra)