leetcode 5 :Longest Palindromic Substring 找出最长回文子串
题目:
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 找出最长回文子串相关推荐
- 【Leetcode】【Longest Palindromic Substring】【最长回文子串】【C++】
题目:给定字符串,求其最长的回文子串 说明:给定字符串长度为1000以内. 思路:for循环遍历字符串,求以i为中心的回文子串长度.与最长回文子串长度max_len比较,若大于max_len,则更新m ...
- 在一个字符串中找出最长回文子串
如何高效的在一个字符串中找到最长的回文子串呢?下面我们根据代码来分析 首先,回文串有两种,一种是字符串的长度是偶数,另一种就是奇数.我们从字符串第二个字符开始,我们把当前起始字符叫做i. ...
- java最长回文子序列_在一个字符串里面怎么找出最长回文子序列长度
回文字符串是什么?类似于level,noon,abbba这种,就是从左读和从右读都是同一个字符串.... 先说一下我的思路: 比如现在有字符串:"12212321" 1,先在每个字 ...
- [*leetcode 5] Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- 【回文串1 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring
LeetCode 5. Longest Palindromic Substring LeetCode中与回文串相关的免费的题目共有15道(5, 9, 125, 131, 132, 214, 234, ...
- LeetCode:Longest Palindromic Substring 最长回文子串
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- 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)} ...
- LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)
Longest Palindromic Substring 最长回文子串 学习笔记 1. Brute method 第一种方法:直接循环求解,o(n2)o(n^2) class Solution:de ...
- LeetCode题解——Longest Palindromic Substring
题目: 给定一个字符串S,返回S中最长的回文子串.S最长为1000,且最长回文子串是唯一. 解法: ①遍历,对于每个字符,计算以它为中心的回文子串长度(长度为奇数),同时计算以它和右边相邻字符为中心的 ...
最新文章
- 【深度】北大王奕森:对抗机器学习的鲁棒、隐私和架构
- 栖息在生态办公室,裸心社与USGBC达成战略合作
- dicom文件_图像识别 | 使用Python对医学Dicom文件的预处理(含代码)
- 使用soapUI代替WSDL2JAVA生成cxf HTTPS 客户端调用代码
- 这个小姐姐真的很火辣......
- 神经网络其实并不需要那么深!普林斯顿大学英特尔提出ParNet,12层的网络就能达到80%以上的准确率!...
- ASA 5520配置failover及双出口
- 基于Javaweb的机房预约管理系统
- 计算机版本过低怎么办,浏览器版本过低嗡嗡叫怎么办_电脑显示浏览器版本过低嗡嗡叫如何处理-win7之家...
- 各大公司的大数据质量监控平台
- 微生物组-扩增子16S分析和可视化(2022.7)
- xcode 中生成和打包 ipa文件的方法和步骤
- 上海拍牌服务器协议,上海拍牌服务器地址
- mpeg4和mp4格式一样吗?
- WhatsApp创始人:从领救济到身价68亿
- css banner滚动,css编写banner轮播
- word打开老是配置进度_电脑打开Word文档弹出配置进度窗口怎么解决
- 拼多多API接口介绍
- linux认证版本,LPI Linux认证考试教程 中文PDF最新版
- sci论文图排版技巧分享