//我的解法 publicclassSolution{ public String longestPalindrome(String s){ int start = 0, end = 0; for (int i = 0; i < s.length(); i++) { int len1 = center(s, i, i);//奇数回文 int len2 = center(s, i, i + 1);//偶数回文 int len = len1 > len2 ? len1 : len2; if (len > end - start) { start = i - (len - 1) / 2; end = i + len / 2; } } return s.substring(start, end + 1); } privateintcenter(String s, int left, int right){ int l = left, r = right; while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) { l--; r++; } return r - l - 1; } }
//Manacher算法,代码来自http://articles.leetcode.com/longest-palindromic-substring-part-ii // Transform S into T. // For example, S = "abba", T = "^#a#b#b#a#$". // ^ and $ signs are sentinels appended to each end to avoid bounds checking string preProcess(string s){ int n = s.length(); if (n == 0) return"^$"; string ret = "^"; for (int i = 0; i < n; i++) ret += "#" + s.substr(i, 1);
ret += "#$"; return ret; }
string longestPalindrome(string s){ string T = preProcess(s); int n = T.length(); int *P = newint[n]; int C = 0, R = 0; for (int i = 1; i < n-1; i++) { int i_mirror = 2*C-i; // equals to i' = C - (i-C) P[i] = (R > i) ? min(R-i, P[i_mirror]) : 0; // Attempt to expand palindrome centered at i while (T[i + 1 + P[i]] == T[i - 1 - P[i]]) P[i]++;
// If palindrome centered at i expand past R, // adjust center based on expanded palindrome. if (i + P[i] > R) { C = i; R = i + P[i]; } }
// Find the maximum element in P. int maxLen = 0; int centerIndex = 0; for (int i = 1; i < n-1; i++) { if (P[i] > maxLen) { maxLen = P[i]; centerIndex = i; } } delete[] P; return s.substr((centerIndex - 1 - maxLen)/2, maxLen); }