查找最长回文子串--Longest Palindromic Substing(java实现时间复杂度O(n))
Posted 潇潇凤儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找最长回文子串--Longest Palindromic Substing(java实现时间复杂度O(n))相关的知识,希望对你有一定的参考价值。
LeetCode 5:Longest Palindromic Substing
题目:寻找最长回文子串
描述:
给定一个字符串s,在s中找到最长的回文子中,假设s的最大长度为1000
如输入"babad" ,输出"bab"工或是"aba"都算正确结果。
输入"cbbd",输入"bb"
思路:
遍历字符串中的每一个字符m,再查找该字符m前后的字符是否相等,记录前L、后R的位置,R-L-1就是字符m所能构成回文子串的最大长度。但有一点需要注意,如果字符m和它的后一个字符串相等,也可以构成回文串。所以如果两者都满足即出现“***ccc***”(***代表省略的字符串)这种情况,则需要计算两种情况下的回文子串,比较它们的大小。
class Solution
public String longestPalindrome(String s)
if(s == null || s.length() <= 1) return s;//边界判断,当s为空或是只有一个字符"a"时(一个字符也算回文)返回它本身
int length = s.length();
int start = 1, left = start, right = start;
String longestParlind = ""+s.charAt(0);//当字符串中每个字符各不相同,则返回第一个字符,即"abcdefg",它的最长回文子串是"a"
int len1 = 0, len2 = 0;//分别记录上面说的两种情况,一个是"**aba**"这种,中间和左右不同,一个是"**aa**"这种情况,中间和左或是右相同
while(start < length)
if((start+1) < length && s.charAt(start-1) == s.charAt(start+1)) //当前字符的左右字符相同时,计算回文长度
len1 = parlindLength(s, start-1, start+1);
if(s.charAt(start-1) == s.charAt(start)) //当前字符和前一个字符相同时,计算回文长度
len2 = parlindLength(s, start-1, start);
int len = Math.max(len1, len2);
if(len > longestParlind.length()) //取出最长的回文子串,这里当然可以优化, 只记录最长回文子串的start\\end位置,最后再调用s.substring方法
longestParlind = s.substring(start-len/2, start+(len+1)/2);
start++;
return longestParlind;
//计算字符在start位置回文子串的长度
private int parlindLength(String s, int left, int right)
int L = left - 1, R = right + 1;
while(L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R))
L--;
R++;
return R-L-1;
此解法,时间复杂度为O(n),比暴力解法O(n^2)更优。空间复杂度为常数。
以上是关于查找最长回文子串--Longest Palindromic Substing(java实现时间复杂度O(n))的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode-5:Longest Palindromic Substring(最长回文子字符串)
算法最长回文子串 longest palindrome substring
[LeetCode] 5. Longest Palindromic Substring 最长回文子串
[Leetcode] Longest palindromic substring 最长回文子串