public String longestPalindromeCenter(String s) { if (s == null || s.length() < 2) return s; int start = 0, maxLen = 1;
for (int i = 0; i < s.length(); i++) { int len1 = expandAroundCenter(s, i, i); // 奇数长度回文:以 s[i] 为中心 int len2 = expandAroundCenter(s, i, i + 1); // 偶数长度回文:以 s[i] 和 s[i+1] 为中心 int len = Math.max(len1, len2); if (len > maxLen) { maxLen = len; // 根据中心 i 和最大长度 len 反推子串起点下标 start = i - (len - 1) / 2; } } return s.substring(start, start + maxLen);
}
private int expandAroundCenter(String s, int left, int right) { while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } // 跳出循环时 s[left] != s[right],实际回文区间是 [left + 1, right - 1] // 长度为 (right - 1) - (left + 1) + 1 = right - left - 1 return right - left - 1; }