非独立思考
class Solution {public String longestPalindrome(String s) {// 中心扩散:遍历每个下标,以下标为中心,利用“回文”的特点向2边扩散,看看能扩散多远// 奇偶次的中心点不同:前者一个下标表示,后者需要两个// 所以设计中心扩散函数时,可以分为:传入重合下标与传入相邻下标int len = s.length();if (len < 2) {return s;}int resLen = 0;int[] res = new int[2];for (int i = 0; i < len; i++) {int[] odd = centerDiffusion(s, i, i);int[] even = centerDiffusion(s, i, i + 1);// 先比较当前的max出来,再与全局的res比较int[] max = odd[1] > even[1] ? odd : even;if (max[1] > resLen) {// 如果当前max的长度大于全局res的长度,就重新赋值res = max;resLen = max[1];}}// 返回子串,以res[0]为起始下标,长度共res[1],所以结束下标为res[0]+res[1]// substring(int beginIndex, int endIndex)return s.substring(res[0], res[0] + res[1]);}public static int[] centerDiffusion(String s, int left, int right) {int len = s.length();int[] res = new int[2];while (left >= 0 && right <= len - 1) {if (s.charAt(left) != s.charAt(right)) {break;} else {left--;right++;}}// 针对在这里的处理是指:原本是遍历到不等的left与right就结束,那么刚才相等的左下标为left+1,右下标为right-1// 不然也不可能执行自增/减操作扩展到left和right// 针对一开始就不等的可能的even情况,那么就会发现其返回的回文串长度为0// 就是特殊情况合并到一般情况。return new int[]{left + 1, right - left - 1};}}
