int n = s.length(); int n0 = n / 2; int n1 = n - n0; int maxLen = Math.max(getMaxLen(s, 1, n0, 0), getMaxLen(s, 1, n1, 1));
// 找出最大长度对应的子字符串 for (int i = 0; i <= n-maxLen; i++){ String subs = s.substring(i, i+maxLen); if (isPalindrome(subs)) return subs; }
return""; }
privateintgetMaxLen(String s, int low, int high, int flag){
int maxLen = 0;
// 二分答案 while (low <= high) { int mid = (low + high) / 2; int len = 2 * mid - flag; if (hasPalindrome(s, len)) { low = mid+1; if (len >= maxLen) maxLen = len; } else { high = mid-1; } } return maxLen;
}
privatebooleanhasPalindrome(String s, int len){ int n = s.length(); if (len > n) returnfalse; for (int i = 0; i <= n-len; i++) if (isPalindrome(s.substring(i, i+len))) returntrue; returnfalse; }
privatebooleanisPalindrome(String s){ int n = s.length(); for (int i = 0; i < n/2; i++) if (s.charAt(i) != s.charAt(n-1-i)) returnfalse; returntrue; }
近期评论