public static String longestPalindrome1(String s) { int startAndEnd[] = new int[2]; for (int i = 0; i < s.length(); i++) { getMaxSubStr(s, startAndEnd, i, i);//奇 getMaxSubStr(s, startAndEnd, i, i + 1);//偶 } return s.substring(startAndEnd[0], startAndEnd[1]); } private static void getMaxSubStr(String s, int[] startAndEnd, int start, int end) { for (; start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end); ) { start--; end++; } if (end - start - 1 > startAndEnd[1] - startAndEnd[0] + 1) { startAndEnd[0] = start + 1; startAndEnd[1] = end;//前包后不包 } }
public String longestPalindrome(String s) { int len = s.length(); if (len < 2) { return s; } int maxLen = 1; String res = s.substring(0, 1); // 中心位置枚举到 len - 2 即可 for (int i = 0; i < len - 1; i++) { String oddStr = centerSpread(s, i, i); String evenStr = centerSpread(s, i, i + 1); String maxLenStr = oddStr.length() > evenStr.length() ? oddStr : evenStr; if (maxLenStr.length() > maxLen) { maxLen = maxLenStr.length(); res = maxLenStr; } } return res; } private String centerSpread(String s, int left, int right) { // left = right 的时候,此时回文中心是一个字符,回文串的长度是奇数 // right = left + 1 的时候,此时回文中心是一个空隙,回文串的长度是偶数 int len = s.length(); int i = left; int j = right; while (i >= 0 && j < len) { if (s.charAt(i) == s.charAt(j)) { i--; j++; } else { break; } } // 这里要小心,跳出 while 循环时,恰好满足 s.charAt(i) != s.charAt(j),因此不能取 i,不能取 j return s.substring(i + 1, j); }