给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串。
样例
给出字符串 "abcdzdcab"
,它的最长回文子串为 "cdzdc"
。
挑战
O(n2) 时间复杂度的算法是可以接受的,如果你能用 O(n) 的算法那自然更好。
解题思路:
对于找回文字串的问题,就要以每一个字符为中心,像两边扩散来寻找回文串,这个算法的时间复杂度是O(n*n)。
注意考虑奇偶情况,由于回文串的长度可奇可偶,比如"bob"是奇数形式的回文,"noon"就是偶数形式的回文,两种形式的回文都要搜索,对于奇数形式的,我们就从遍历到的位置为中心,向两边进行扩散,对于偶数情况,我们就把当前位置和下一个位置当作偶数行回文的最中间两个字符,然后向两边进行搜索。
public class Solution {
/**
* @param s: input string
* @return: the longest palindromic substring
*/
public String longestPalindrome(String s) {
// write your code here
String res = "";
//奇数形式的回文判断
for(int i=0; i<s.length(); i++){
String temp = null;
int l=i, r=i;
for(; l>=0 && r<s.length(); l--,r++){
if(s.charAt(l) != s.charAt(r))
break;
}
temp = s.substring(l+1, r);
if(temp.length() > res.length())
res = temp;
}
//偶数形式的回文判断
for(int i=0; i<s.length()-1; i++){
String temp = null;
int l=i, r=i+1;
for(; l>=0 && r<s.length(); l--,r++){
if(s.charAt(l) != s.charAt(r))
break;
}
temp = s.substring(l+1, r);
if(temp.length() > res.length())
res = temp;
}
return res;
}
}