题目:

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];// 对角线 1for(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);}elsedp[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];// 对角线 1for(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);}elsedp[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 ssLen = 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 = tmpreturn longestdef longestPalindromeCenter(self, s,left,right):while(left>=0 and right<len(s) and s[left]==s[right]):left-=1right+=1return 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] = 1for i in range(sLen-1):if s[i]==s[i+1]:dp[i][i+1] = 1longest = 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] = 0return longest

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

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

String s1="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";String s2="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";String s3 = "vmqjjfnxtyciixhceqyvibhdmivndvxyzzamcrtpywczjmvlodtqbpjayfchpisbiycczpgjdzezzprfyfwiujqbcubohvvyakxfmsyqkysbigwcslofikvurcbjxrccasvyflhwkzlrqowyijfxacvirmyuhtobbpadxvngydlyzudvnyrgnipnpztdyqledweguchivlwfctafeavejkqyxvfqsigjwodxoqeabnhfhuwzgqarehgmhgisqetrhuszoklbywqrtauvsinumhnrmfkbxffkijrbeefjmipocoeddjuemvqqjpzktxecolwzgpdseshzztnvljbntrbkealeemgkapikyleontpwmoltfwfnrtnxcwmvshepsahffekaemmeklzrpmjxjpwqhihkgvnqhysptomfeqsikvnyhnujcgokfddwsqjmqgsqwsggwhxyinfspgukkfowoxaxosmmogxephzhhy";

leetcode 5 :Longest Palindromic Substring 找出最长回文子串相关推荐

  1. 【Leetcode】【Longest Palindromic Substring】【最长回文子串】【C++】

    题目:给定字符串,求其最长的回文子串 说明:给定字符串长度为1000以内. 思路:for循环遍历字符串,求以i为中心的回文子串长度.与最长回文子串长度max_len比较,若大于max_len,则更新m ...

  2. 在一个字符串中找出最长回文子串

    如何高效的在一个字符串中找到最长的回文子串呢?下面我们根据代码来分析 首先,回文串有两种,一种是字符串的长度是偶数,另一种就是奇数.我们从字符串第二个字符开始,我们把当前起始字符叫做i.        ...

  3. java最长回文子序列_在一个字符串里面怎么找出最长回文子序列长度

    回文字符串是什么?类似于level,noon,abbba这种,就是从左读和从右读都是同一个字符串.... 先说一下我的思路: 比如现在有字符串:"12212321" 1,先在每个字 ...

  4. [*leetcode 5] Longest Palindromic Substring

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

  5. 【回文串1 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring

    LeetCode 5. Longest Palindromic Substring LeetCode中与回文串相关的免费的题目共有15道(5, 9, 125, 131, 132, 214, 234, ...

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

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

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

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

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

  9. LeetCode题解——Longest Palindromic Substring

    题目: 给定一个字符串S,返回S中最长的回文子串.S最长为1000,且最长回文子串是唯一. 解法: ①遍历,对于每个字符,计算以它为中心的回文子串长度(长度为奇数),同时计算以它和右边相邻字符为中心的 ...

最新文章

  1. 【深度】北大王奕森:对抗机器学习的鲁棒、隐私和架构
  2. 栖息在生态办公室,裸心社与USGBC达成战略合作
  3. dicom文件_图像识别 | 使用Python对医学Dicom文件的预处理(含代码)
  4. 使用soapUI代替WSDL2JAVA生成cxf HTTPS 客户端调用代码
  5. 这个小姐姐真的很火辣......
  6. 神经网络其实并不需要那么深!普林斯顿大学英特尔提出ParNet,12层的网络就能达到80%以上的准确率!...
  7. ASA 5520配置failover及双出口
  8. 基于Javaweb的机房预约管理系统
  9. 计算机版本过低怎么办,浏览器版本过低嗡嗡叫怎么办_电脑显示浏览器版本过低嗡嗡叫如何处理-win7之家...
  10. 各大公司的大数据质量监控平台
  11. 微生物组-扩增子16S分析和可视化(2022.7)
  12. xcode 中生成和打包 ipa文件的方法和步骤
  13. 上海拍牌服务器协议,上海拍牌服务器地址
  14. mpeg4和mp4格式一样吗?
  15. WhatsApp创始人:从领救济到身价68亿
  16. css banner滚动,css编写banner轮播
  17. word打开老是配置进度_电脑打开Word文档弹出配置进度窗口怎么解决
  18. 拼多多API接口介绍
  19. linux认证版本,LPI Linux认证考试教程 中文PDF最新版
  20. sci论文图排版技巧分享

热门文章

  1. 为什么 MySQL 的自增主键不单调也不连续
  2. Java泛型背后是什么?
  3. 一张图了解 Spring Cloud 微服务架构
  4. 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
  5. 最新版IDEA常用配置指南,打造你的最酷IDE
  6. 浪漫的形式有100种,单身的就1种!
  7. 神经网络知识专题总结!
  8. 一个「PPT」框架,让超大模型调参变简单:清华刘知远、黄民烈团队力作
  9. 还需要“attention”吗?一堆“前馈层”在ImageNet上表现得出奇得好
  10. 损失函数的可视化:浅论模型的参数空间与正则