题目:

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

翻译:

找出字符串s中最长的回文子串,字符串s的最长是1000,假设存在唯一的最长回文子串

法一:直接暴力破解

O(N3)的时间复杂度,运行超时:

Java程序:

  1. public class Solution {
  2. public String longestPalindrome(String s) {
  3. // isPalindrome(s);
  4. int sLen = s.length();
  5. int maxLen = 0;
  6. String maxSubStr="";
  7. if(sLen==1) return s;
  8. for(int i=0;i<sLen;i++){
  9. for(int j=i+1;j<sLen-1;j++){
  10. String subStr = s.substring(i,j+1);
  11. if(isPalindrome(subStr)){
  12. int tmp = subStr.length();
  13. if(tmp >maxLen){
  14. maxLen = tmp;
  15. maxSubStr = subStr;
  16. }
  17. }
  18. }
  19. }
  20. return maxSubStr;
  21. }
  22. boolean isPalindrome(String s){
  23. int sLen = s.length();
  24. if(sLen==1) return true;
  25. for(int i = 0;i<sLen/2;i++){
  26. char left = s.charAt(i);
  27. char right = s.charAt(sLen - i -1);
  28. if(left!=right)
  29. return false;
  30. }
  31. return true;
  32. }
  33. }

法二:

网上找个O(N2

定义一个dp矩阵 长度是字符串s的长度

初始值问题:

对角线设为1

为了防止回文序列长度是偶数要对s[i] 与s[i+1]相等作判断

若s[i]== s[j],则dp[i][j] = 1

对于s[i] 到s[j] 部分是否是回文字符串,需要考虑的是s[i+1]到s[j-1]部分是不是回文

可以转化为:若s[i] == s[j] ,则考虑s[i+1] 是否等于s[j-1],这里只需判断最近的一个就好了,因为这是从里面向外面循环的

对于dp矩阵的元素就是:若dp[i][j] = 1,则考虑d[i+1][j-1]是否等于 1,若d[i+1][j-1]=0,则 ,令dp[i][j]=0,里面不回文外面一定不回文。

  1. public String longestPalindrome(String s){
  2. if(s==null) return null;
  3. if(s.length()<=1) return s;
  4. int sLen = s.length();
  5. int maxLen = 1;
  6. String longest = null;
  7. int[][] dp = new int[sLen][sLen];
  8. // 对角线 1
  9. for(int i=0;i<sLen;++i)
  10. dp[i][i]=1;
  11. // 相邻元素是否相等,主要是用来判断回文长度是偶数
  12. for(int i=0;i<sLen-1;++i){
  13. if(s.charAt(i)==s.charAt(i+1)){
  14. dp[i][i+1] = 1;
  15. longest = s.substring(i,i+2);
  16. }
  17. }
  18. // 依次遍历所有可能长度的回文数
  19. for(int k=2;k<sLen;++k){
  20. for(int i=0;i<sLen-k;++i){
  21. int j = i+k;
  22. if(s.charAt(i) == s.charAt(j)){
  23. dp[i][j] = dp[i+1][j-1];
  24. if(dp[i][j]==1 && k>maxLen)
  25. longest = s.substring(i,j+1);
  26. }else
  27. dp[i][j]=0;
  28. }
  29. }
  30. return longest;
  31.  
  32. }
  1. Time Limit Exceeded
  2. Last executed input:
  3. "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"

这里是全部一样的,执行超时。

增加一个集合用于判断字符串中元素全部一样的情况

运行依旧超时

  1. public class Solution {
  2.  
  3. String longestPalindrome(String s){
  4. if(s==null) return null;
  5. if(s.length()<=1) return s;
  6. int sLen = s.length();
  7. int maxLen = 1;
  8. String longest = null;
  9. TreeSet ts = new TreeSet();
  10. for(int i=0;i<sLen;i++)
  11. ts.add(s.charAt(i));
  12. if(ts.size()==1) return s;
  13. int[][] dp = new int[sLen][sLen];
  14. // 对角线 1
  15. for(int i=0;i<sLen;++i)
  16. dp[i][i]=1;
  17. // 相邻元素是否相等,主要是用来判断回文长度是偶数
  18. for(int i=0;i<sLen-1;++i){
  19. if(s.charAt(i)==s.charAt(i+1)){
  20. dp[i][i+1] = 1;
  21. longest = s.substring(i,i+2);
  22. }
  23. }
  24. // 依次遍历所有可能长度的回文数
  25. for(int k=2;k<sLen;++k){
  26. for(int i=0;i<sLen-k;++i){
  27. int j = i+k;
  28. if(s.charAt(i) == s.charAt(j)){
  29. dp[i][j] = dp[i+1][j-1];
  30. if(dp[i][j]==1 && k>maxLen)
  31. longest = s.substring(i,j+1);
  32. }else
  33. dp[i][j]=0;
  34. }
  35. }
  36. return longest;
  37.  
  38. }
  39. }

依旧超时:

  1. Last executed input:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

法三:

时间复杂度:O(N2)

空间复制度:O(1)

也是来源于上面链接中的程序

这里的思想是:对应字符串中的i位置,向两侧依次判断是否相等,遇到第一个不相等的时候,结束判断

对应最大回文长度是偶数的,要先判断s[i]与s[i+1]是否相等后,再作上面类似的操作

这个AC了

  1. class Solution{
  2. String longestPalindrome(String s){
  3. if(s.isEmpty()) return null;
  4. if(s.length() == 1) return s;
  5. String longest = s.substring(0,1);
  6. for(int i=0;i<s.length();++i){
  7. // 这里考虑的是回文长度是奇数的情况
  8. String tmp = longestPalindromeCenter(s,i,i);
  9. if(tmp.length() > longest.length())
  10. longest = tmp;
  11. //偶数时候
  12. if(i<s.length() -1 && s.charAt(i)==s.charAt(i+1) ){
  13. tmp = longestPalindromeCenter(s,i,i+1);
  14. if(tmp.length() > longest.length())
  15. longest = tmp;
  16. }
  17. }
  18. return longest;
  19. }
  20. String longestPalindromeCenter(String s,int left,int right){
  21. while(left>=0 && right< s.length() && s.charAt(left)== s.charAt(right)){
  22. left--;
  23. right++;
  24. }// 以s[i] 为中心向两侧扩展,直到不满足回文的条件结束
  25. return s.substring(left+1,right);// 结束的时候已经执行了left-- right++ 要去掉
  26. }
  27. }

上面的对于是偶数的可以不要判断,因为在下面的while中有先对这个两个起始点的判断了

对应的Python程序:

  1. class Solution(object):
  2. def longestPalindrome2(self, s):
  3. longest = ''
  4. if len(s)<=1 : return s
  5. sLen = len(s)
  6. for i in range(sLen):
  7. tmp = self.longestPalindromeCenter(s,i,i)
  8. if len(tmp) > len(longest):
  9. longest = tmp
  10. # if i<sLen-1 and s[i]==s[i+1]:
  11. # tmp = self.longestPalindromeCenter(s, i, i+1)
  12. # if len(tmp)>len(longest):
  13. # longest = tmp
  14. # if i<sLen-1 and s[i]==s[i+1]:
  15. tmp = self.longestPalindromeCenter(s, i, i+1)
  16. if len(tmp)>len(longest):
  17. longest = tmp
  18. return longest
  19.  
  20. def longestPalindromeCenter(self, s,left,right):
  21. while(left>=0 and right<len(s) and s[left]==s[right]):
  22. left-=1
  23. right+=1
  24. return s[(left+1):right]
  25.  
  26. def longestPalindrome(self, s):
  27. if len(s)<=1: return s
  28. sLen = len(s)
  29. dp = [[0 for _ in range(sLen)] for _ in range(sLen)]
  30. longest=""
  31. for i in range(sLen):
  32. dp[i][i] = 1
  33. for i in range(sLen-1):
  34. if s[i]==s[i+1]:
  35. dp[i][i+1] = 1
  36. longest = s[i:(i+2)]
  37. for k in range(2,sLen):
  38. for i in range(0,sLen-k):
  39. j = i + k
  40. if s[i]==s[j]:
  41. dp[i][j]=dp[i+1][j-1]
  42. if dp[i][j]==1 and len(s[i:(j+1)])>len(longest):
  43. longest = s[i:(j+1)]
  44. else:
  45. dp[i][j] = 0
  46. return longest

依旧是根据中心点查找的AC,下面一个时间超时

附几个让你超时的测试字符串:

  1. String s1="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  2. String s2="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";
  3. String s3 = "vmqjjfnxtyciixhceqyvibhdmivndvxyzzamcrtpywczjmvlodtqbpjayfchpisbiycczpgjdzezzprfyfwiujqbcubohvvyakxfmsyqkysbigwcslofikvurcbjxrccasvyflhwkzlrqowyijfxacvirmyuhtobbpadxvngydlyzudvnyrgnipnpztdyqledweguchivlwfctafeavejkqyxvfqsigjwodxoqeabnhfhuwzgqarehgmhgisqetrhuszoklbywqrtauvsinumhnrmfkbxffkijrbeefjmipocoeddjuemvqqjpzktxecolwzgpdseshzztnvljbntrbkealeemgkapikyleontpwmoltfwfnrtnxcwmvshepsahffekaemmeklzrpmjxjpwqhihkgvnqhysptomfeqsikvnyhnujcgokfddwsqjmqgsqwsggwhxyinfspgukkfowoxaxosmmogxephzhhy";

leetcode 5 :Longest Palindromic Substring 找出最长回文子串的更多相关文章

  1. LeetCode 5 Longest Palindromic Substring manacher算法,最长回文子序列,string.substr(start,len) 难度:2

    https://leetcode.com/problems/longest-palindromic-substring/ manacher算法相关:http://blog.csdn.net/ywhor ...

  2. leetcode:Longest Palindromic Substring(求最大的回文字符串)

    Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...

  3. PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  4. 最长回文子串-LeetCode 5 Longest Palindromic Substring

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

  5. 【LeetCode】Longest Palindromic Substring 解题报告

    DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...

  6. 【LeetCode】5. Longest Palindromic Substring 最长回文子串

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:最长回文子串,题解,leetcode, 力扣,python ...

  7. 求最长回文子串 - leetcode 5. Longest Palindromic Substring

    写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...

  8. LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法

    LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...

  9. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

    Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...

随机推荐

  1. JQGrid+Webservice+LINQ

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="jqgridtest.asp ...

  2. 联想预装win8系统改成win7操作步骤及注意事项

    联想消费台式机与一体机预装Windows8改装Windows7的操作步骤及常见问题 前提说明: 目前联想出厂预装Windows 8的台式和一体机使用都是UEFI+GPT硬盘的组合,并且开启了安全启动, ...

  3. mongodb的常用操作(三)

    继续mongodb的学习和总结: 11.mongodb的mapreduce功能 mapreduce可以说是mongodb的一个很强大的功能,可以实现复杂的运算和统计,做一个简要的总结: 假设有user ...

  4. How to use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem

    SQLIOSim是模拟SQLServer的行为来测试IO性能,也可以对损坏磁盘进行一定校验 这是一个SQL Server 2012 安装完后自带的工具 一般在C:\Program Files\Micr ...

  5. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space解决方法 问题描述 Exception ...

  6. 折腾了好久的macos+apache+php+phpmyadmin 终于成功了!

    由于最近需要布置mantis用来进行bug追踪,在此记录其过程. 由于PHP apache环境在Mac OS上是自带的,所以不需要另处下安装包,只需要简单配置一下即可. 首先打开终端输入命令: sud ...

  7. Zend Studio 12.0.2正式版发布和破解方法,zend studio 12.0.1汉化,相式设置为Dreamweaver,空格缩进为4个, 代码默认不折叠的设置,Outline中使用的图形标志,代码颜色之eot设置。

    背景:zend studio 12.0.2 修复了一个12.0.1的:  Fixed problem with referenced variables marked as undefined,我都说 ...

  8. Http请求和响应应用

    //以下载方式打开资源 public void test4(HttpServletResponse response) throws IOException { response.setHeader( ...

  9. C++中的仿函数,std::function和bind()的用法

    1.仿函数:又叫std::function,是C++中的一个模板类 2.C语言中的函数指针: int  add(int a,int b) { return a+b; } typedef int (*f ...

  10. python学习小结7:变量类型

    变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...