最长回文子串
题目:最长回文子串
问题描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
解决思路:
本题可以采用中心扩展算法:顾名思义,由于回文串具有中心对称的性质,所以我们可以根据字符串中的某一个字符开始分别向左向右扩展,直到找到不相等的字符为止,这样得到的字符串即是能够得到的最长回文串。
我们应该注意,当回文串的长度是偶数时,中心有n-1个;而当回文串的长度是奇数时,中心就有n个(n为回文串的长度):
解决代码:
class Solution {
public static String longestPalindrome(String s) {
if (s.length() < 2) {
return s;
}
// 最长回文子串长度
int maxLen = 0;
// 回文子串中心
int center = 0;
for (int i = 0; i < s.length(); i++){
// 最长回文串长度为奇数
int begin = centerExpand(s, i, i);
// 最长回文串长度为偶数
int end = centerExpand(s, i, i + 1);
if (maxLen < Math.max(begin, end)){
center = i;
maxLen = Math.max(begin, end);
}
}
// 如果回文子串的长度为偶数,那么中心左边的长度会比右边的长度小1
return s.substring(center - (maxLen - 1) / 2, center + maxLen / 2 + 1);
}
private static int centerExpand(String s, int begin, int end){
while (begin >= 0 && end < s.length() && s.charAt(begin) == s.charAt(end)){
begin--;
end++;
}
// 返回以begin和end为基准,同时向左向右扩展后能够得到的最长回文串长度
return end - begin - 1;
}
}