给你一个字符串
s
,找到s
中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
此题应用中心扩展算法,应想到对于字符串某一位置的字符,它的前后位置如果相等,则这个字符串是一个回文子串,若此回文子串的前后位置依然相等,则这又是一个回文子串。所以可以构建一个方法去取得回文子串长度。
public int maxLen(String s,int left,int right){
while(left >=0 && right <= s.length() - 1 && s.charAt(left) == s.charAt(right)){
left--;
right++;
}
return right - left - 1;
}
然后由于可能回文子串是偶数个相同的字符,例如"abbc"其中"bb"是回文子串所以可以将原本描述中的某一位置变化为某两位置。
class Solution {
public String longestPalindrome(String s) {
if(s.length() < 2){
return s;
}
int start = 0;
int end = 0;
for(int i = 0;i < s.length();i++){
int len1 = maxLen(s,i,i);
int len2 = maxLen(s,i,i + 1);
int len = Math.max(len1,len2);
if(len > end - start){
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start,end + 1);
}
public int maxLen(String s,int left,int right){
while(left >=0 && right <= s.length() - 1 && s.charAt(left) == s.charAt(right)){
left--;
right++;
}
return right - left - 1;
}
}