问题
给定一个字符串,找到最长的回文连续子字符串。如果不止一个,则返回一个即可。例如,“aabcdcb”的最长回文子串是“bcdcb”。 “bananas”的最长回文子串是“anana”。
中心扩展算法
public static String longestPalindrome(String s) {
if (s == null || s.length() < 1) {
return "";
}
int start = 0;
int end = 0;
for (int i = 0; i < s.length(); i++) {
// 精髓在于此,len1,i与i比较,对应于奇数个数,中心对应i这个数,向两边扩散。aca
// len2,以此类推,对应于偶数个数,中心对应i和i+1中间的空格,相当于已经扩散了一次,已经在i和i+1上,向两边扩散。fddf
int len1 = expandAroundCenter(s, i, i); // 检测长度为奇数的子串, 例如aba
int len2 = expandAroundCenter(s, i, i + 1); // 检测长度为偶数的子串, 例如abba
int len = Math.max(len1, len2);
if (len > end - start) {
// 假设回文串长度为奇数,start与i之间的距离为(2n+1)/2;
// 假设回文串长度为偶数,start与i的距离为(2n)/2-1;
// 而在整数除法里,(2n)/2-1与(2n-1)/2是相等的;(2n+1)/2与(2n)/2的结果是相等的;
// 于是start与i之间的距离得以统一;对于end来说,分析是一致的
start = i - (len - 1) / 2; // 扩展后, 以i为中心,左指针前移一半长度
end = i + len / 2; // 扩展后, 以i为中心,右指针后移一半长度
}
}
return s.substring(start, end + 1);
}
public static int expandAroundCenter(String s, int left, int right) {
//left:相当于指向中间位置的第一位;