题目要求

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"Output: "bab"

Note: "aba" is also a valid answer.

Example:

Input: "cbbd"Output: "bb"

翻译过来就是说:在一个字符串中寻找最长的子字符串,该字符串是回数(即从左往右和从右往左读的结果是相同的)。该字符串的最大长度为1000

思路一:头指针+尾指针

遍历字符串,找到当前头指针的元素下一次出现时的下标,并且判断该子字符串是否是回数。

    public String longestPalindrome(String s) {StringBuilder result = new StringBuilder();int resultLength = 0;StringBuilder temp = new StringBuilder();for(int i = 0 ; i<s.length()-resultLength ; i++){for(int j = s.lastIndexOf(s.charAt(i)) ; j>=i+resultLength ; j = s.substring(0, j).lastIndexOf(s.charAt(i))){temp = new StringBuilder(s.substring(i, j+1));if(temp.toString().equals(temp.reverse().toString())){result = temp;resultLength = temp.length();break;}    }}return result.toString();}

在该方法中,已经对遍历进行了优化,尽可能减少了无效遍历,例如当长度一定小于当前结果的最大长度时,跳出当前循环并进入下一个遍历。但是仍然有很多无效的遍历,因此该答案最后还是超时的。

思路二:指针+最大长度

现在我们从回数的特点入手。
假若一个字符串是一个回数,那么该字符串内部一定还存在更多的回数。例如,abbbcbbba是一个回数,那么bbbcbbb一定是一个回数,那么bcb也是回数,最后到b。同理,bccb是一个回数,那么cc也是一个回数。因此可以看出,假设当前一个字符串是回数,那么加上两侧的字符可能还是回数。假设当前一个字符串不是回数,那么加上右侧的字符可能构成一个回数。
因此,假设当前得到的回数的最大长度为n,我们可以判断n+1或者n+2是不是回数。
为什么这么判断呢?下面给出证明。
我们假设有一个字符串xxxxxxxxabaxxxxxxs,其中x代表任意字符。
假设此时指针指向s,而已知最大回数子字符串的长度为3。我们只需要判断xxxs以及xxxxs是不是回数。无需判断xxs乃至更近是因为它们的长度必然无法超过当前的最大长度。而无需判断xxxxxs乃至更远是因为假如xxxxxs是回数,那么xxxx一定是回数,则当前的最大长度为4而不是3,与题设不符。所以只需判断两种情况。
这里就充分利用了回数的性质,省去了很多无效的遍历

    public String longestPalindrome2(String s) {StringBuilder result = new StringBuilder();int curLength = 0;for(int i = 0 ; i<s.length() ; i++){if(isPalindromic(s, i-curLength-1, i)){result = new StringBuilder(s.substring(i-curLength-1, i+1));curLength += 2;}else if(isPalindromic(s, i-curLength, i)){result = new StringBuilder(s.substring(i-curLength, i+1));curLength += 1;}}return result.toString();}public boolean isPalindromic(String s, int start, int end){if(start<0){return false;}while(start<end){if(s.charAt(start++)!=s.charAt(end--)) return false; }return true;}

思路三:由中间至两边找回数

思路三就像是思路一的彻底反转。思路一优先寻找回数的边缘,而思路三则直接从中间开始寻找,直至找到最远的边缘。
正如上面所说,回数的中间可能是一个单值,如aba中的b;也可能是双值,如abba中的bb。
我们可以对当前下标上的单值双值都进行尝试
以下是我在leetcode上找到的一个实现(88%)

public class Solution {
private int lo, maxLen;public String longestPalindrome(String s) {int len = s.length();if (len < 2)return s;for (int i = 0; i < len-1; i++) {extendPalindrome(s, i, i);  //assume odd length, try to extend Palindrome as possibleextendPalindrome(s, i, i+1); //assume even length.}return s.substring(lo, lo + maxLen);
}private void extendPalindrome(String s, int j, int k) {while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {j--;k++;}if (maxLen < k - j - 1) {lo = j + 1;maxLen = k - j - 1;}
}}


想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

leetcode5 Longest Palindromic Substring 最长且为回数的子字符串相关推荐

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

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

  2. LeetCode:Longest Palindromic Substring 最长回文子串

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

  3. Java Longest Palindromic Substring(最长回文字符串)

    假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic string.如aba,或者abba.本题是这种,给定输入一个字符串.要求输出一个子串,使得子串是最长的padro ...

  4. 转载-----Java Longest Palindromic Substring(最长回文字符串)

    转载地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic st ...

  5. 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)} ...

  6. 【LeetCode】No.5. Longest Palindromic Substring -- Java Version

    题目链接: https://leetcode.com/problems/longest-palindromic-substring/ 1. 题目介绍(最长回文子串) Given a string s, ...

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

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

  8. 21.Longest Palindromic Substring(最长回文子串)

    Level:   Medium 题目描述: Given a string s, find the longest palindromic substring in s. You may assume ...

  9. 最长回文子串(Longest Palindromic Substring)

    转载自  最长回文子串(Longest Palindromic Substring)--三种时间复杂度的解法 子串:小于等于原字符串长度由原字符串中任意个连续字符组成的子序列 回文:关于中间字符对称的 ...

最新文章

  1. 同事今天早上拍的几幅雪后的照片。传上来大家看看。
  2. WAV文件中使用有符合整形数
  3. 计算机网络管理云红艳电子版,计算机网络管理pdf
  4. 嵌入式之NB-IoT开发与应用01【移动通信网络发展概述、NB-IoT应用案例、物联网生态系统-解决方案、智慧消防项目需求分析及系统设计】
  5. c++抽象类在多继承中的应用
  6. linux安装zlib_Linux zlib和libpng安装(LAMP环境搭建)
  7. 认证方案之初步认识JWT
  8. C#图片按指定大小分割
  9. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)
  10. [性能优化]UITableView性能优化的一点感悟及计算UILabel高度的新方法 1
  11. vue中的静态资源打包
  12. 大数据-数据仓库的概念
  13. 微信存储空间占用问题
  14. nginx 的基本概念
  15. 校园商铺项目 SSM迭代Spring Boot项目实战视频
  16. java 给一个开学日期,计算当天是开学第几周星期几或者开学第几周星期几为哪一天
  17. 理解计算 从根号2到AlphaGo 第3季神经网络的数学模型
  18. python3思维导图.xmind_我常用的3款脑图工具
  19. 宅男福利!我用Python做了一个B站跳舞的小姐姐,满屏的美腿!
  20. 10个咖啡的事实 不看不知道一看吓一跳

热门文章

  1. Queue 输出数据
  2. 写一个方法,用一个for循环打印九九乘法表
  3. 终于从yahoo手中把域名抢救出来了
  4. 在VS2005中设计WinForms应用程序已完成设计的界面突然丢失的解决
  5. 工控补丁星期二:西门子、施耐德电气修复40个漏洞
  6. CIA 数据泄露事件报告出炉:光为他人做嫁衣,自家着火不自知
  7. Hey! 首先祝贺 SpaceX 发射成功,其次我黑了 NASA 某IT 承包商网络哟~
  8. SuperTuxKart 0.10 测试版发布
  9. 最简单的 RabbitMQ 监控方法 - 每天5分钟玩转 OpenStack(158)
  10. Linux内核list_head学习(二)