题目:

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程序:

public class Solution {
public String longestPalindrome(String s) {
// isPalindrome(s);
int sLen = s.length();
int maxLen = 0;
String maxSubStr="";
if(sLen==1) return s;
for(int i=0;i<sLen;i++){
for(int j=i+1;j<sLen-1;j++){
String subStr = s.substring(i,j+1);
if(isPalindrome(subStr)){
int tmp = subStr.length();
if(tmp >maxLen){
maxLen = tmp;
maxSubStr = subStr;
}
}
}
}
return maxSubStr;
}
boolean isPalindrome(String s){
int sLen = s.length();
if(sLen==1) return true;
for(int i = 0;i<sLen/2;i++){
char left = s.charAt(i);
char right = s.charAt(sLen - i -1);
if(left!=right)
return false;
}
return true;
}
}

法二:

网上找个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,里面不回文外面一定不回文。

public String longestPalindrome(String s){
if(s==null) return null;
if(s.length()<=1) return s;
int sLen = s.length();
int maxLen = 1;
String longest = null;
int[][] dp = new int[sLen][sLen];
// 对角线 1
for(int i=0;i<sLen;++i)
dp[i][i]=1;
// 相邻元素是否相等,主要是用来判断回文长度是偶数
for(int i=0;i<sLen-1;++i){
if(s.charAt(i)==s.charAt(i+1)){
dp[i][i+1] = 1;
longest = s.substring(i,i+2);
}
}
// 依次遍历所有可能长度的回文数
for(int k=2;k<sLen;++k){
for(int i=0;i<sLen-k;++i){
int j = i+k;
if(s.charAt(i) == s.charAt(j)){
dp[i][j] = dp[i+1][j-1];
if(dp[i][j]==1 && k>maxLen)
longest = s.substring(i,j+1);
}else
dp[i][j]=0;
}
}
return longest; }
Time Limit Exceeded
Last executed input:
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"

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

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

运行依旧超时

public class Solution {

  String longestPalindrome(String s){
if(s==null) return null;
if(s.length()<=1) return s;
int sLen = s.length();
int maxLen = 1;
String longest = null;
TreeSet ts = new TreeSet();
for(int i=0;i<sLen;i++)
ts.add(s.charAt(i));
if(ts.size()==1) return s;
int[][] dp = new int[sLen][sLen];
// 对角线 1
for(int i=0;i<sLen;++i)
dp[i][i]=1;
// 相邻元素是否相等,主要是用来判断回文长度是偶数
for(int i=0;i<sLen-1;++i){
if(s.charAt(i)==s.charAt(i+1)){
dp[i][i+1] = 1;
longest = s.substring(i,i+2);
}
}
// 依次遍历所有可能长度的回文数
for(int k=2;k<sLen;++k){
for(int i=0;i<sLen-k;++i){
int j = i+k;
if(s.charAt(i) == s.charAt(j)){
dp[i][j] = dp[i+1][j-1];
if(dp[i][j]==1 && k>maxLen)
longest = s.substring(i,j+1);
}else
dp[i][j]=0;
}
}
return longest; }
}

依旧超时:

Last executed input:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

法三:

时间复杂度:O(N2)

空间复制度:O(1)

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

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

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

这个AC了

class Solution{
String longestPalindrome(String s){
if(s.isEmpty()) return null;
if(s.length() == 1) return s;
String longest = s.substring(0,1);
for(int i=0;i<s.length();++i){
// 这里考虑的是回文长度是奇数的情况
String tmp = longestPalindromeCenter(s,i,i);
if(tmp.length() > longest.length())
longest = tmp;
//偶数时候
if(i<s.length() -1 && s.charAt(i)==s.charAt(i+1) ){
tmp = longestPalindromeCenter(s,i,i+1);
if(tmp.length() > longest.length())
longest = tmp;
}
}
return longest;
}
String longestPalindromeCenter(String s,int left,int right){
while(left>=0 && right< s.length() && s.charAt(left)== s.charAt(right)){
left--;
right++;
}// 以s[i] 为中心向两侧扩展,直到不满足回文的条件结束
return s.substring(left+1,right);// 结束的时候已经执行了left-- right++ 要去掉
}
}

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

对应的Python程序:

class Solution(object):
def longestPalindrome2(self, s):
longest = ''
if len(s)<=1 : return s
sLen = len(s)
for i in range(sLen):
tmp = self.longestPalindromeCenter(s,i,i)
if len(tmp) > len(longest):
longest = tmp
# if i<sLen-1 and s[i]==s[i+1]:
# tmp = self.longestPalindromeCenter(s, i, i+1)
# if len(tmp)>len(longest):
# longest = tmp
# if i<sLen-1 and s[i]==s[i+1]:
tmp = self.longestPalindromeCenter(s, i, i+1)
if len(tmp)>len(longest):
longest = tmp
return longest def longestPalindromeCenter(self, s,left,right):
while(left>=0 and right<len(s) and s[left]==s[right]):
left-=1
right+=1
return s[(left+1):right] def longestPalindrome(self, s):
if len(s)<=1: return s
sLen = len(s)
dp = [[0 for _ in range(sLen)] for _ in range(sLen)]
longest=""
for i in range(sLen):
dp[i][i] = 1
for i in range(sLen-1):
if s[i]==s[i+1]:
dp[i][i+1] = 1
longest = s[i:(i+2)]
for k in range(2,sLen):
for i in range(0,sLen-k):
j = i + k
if s[i]==s[j]:
dp[i][j]=dp[i+1][j-1]
if dp[i][j]==1 and len(s[i:(j+1)])>len(longest):
longest = s[i:(j+1)]
else:
dp[i][j] = 0
return longest

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

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

String s1="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
String s2="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";
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. 分享:mysql 随机查询数据

    在mysql中查询5条不重复的数据,使用以下: 1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5  就可以了.但是真正测试一下才发现这样效率非常低.一个1 ...

  2. Microsoft Virtual Academy 介绍

    Microsoft Virtual Academy 是微软的虚拟学院,会推出微软各个方面的一些教程 介绍一点有用的链接 http://www.microsoftvirtualacademy.com/e ...

  3. STM32 ucosii 串口接收数据 遇到的问题及解决思路

    写一个程序,用到了ucos ii ,串口在中断中接收数据(一包数据 8个字节 包含: 1byte包头 5byte数据 1byte校验和 1byte 包尾 ) ,数据由上位机每隔500ms发送一次,在串 ...

  4. 一个订单相关的存储过程(MySQL)

    BEGIN DECLARE currentDate VARCHAR(15) ;/*当前日期,有可能包含时分秒 */ DECLARE maxNo INT DEFAULT 0 ; /* 离现在最近的满足条 ...

  5. oracle作业

    http://blog.csdn.net/hao_ds/article/details/38382931 oracle作业各种参数的详细介绍

  6. LINQ.CS

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Zdso ...

  7. 还原没有日志文件的SQL数据库

    1.执行命令示例: EXEC sys.sp_attach_db @dbname = 'AdventrueWorks2012_Data',     @filename1 = N'C:\Program F ...

  8. spring中Bean的注入类型

    1.属性注入    即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式.    属性注入要求Bean提供 ...

  9. C++(MFC)

    C++(MFC) 1.关联变量(与控件关联): (1)一组单选按钮:需要将第一个单选按钮的Group选项设为true,则单选按钮就为一组(组框为标示作用).选中第一个则为0,第二个为1,依次类推(P2 ...

  10. 从一个新手容易混淆的例子简单分析C语言中函数调用过程

    某天,王尼玛写了段C程序: #include <stdio.h> void input() { int i; ]; ; i < ; i++) { array[i] = i; } } ...