Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
思考:遍历求每个字符的左右延伸的最长字符串。
class Solution { public: string compare(string s,int left,int right) { while(left>=0&&right<s.size()) { if(s[left]==s[right]) { left--; right++; } else break; } return s.substr(left+1,right-left-1); } string longestPalindrome(string s) { int len=0; int maxlen=0; string ans,res; for(int i=0;i<s.size();i++) { ans=compare(s,i,i); if(ans.size()>res.size()) res=ans; ans=compare(s,i,i+1); if(ans.size()>res.size()) res=ans; } return res; } };
网上有个更好的Manacher算法,只要O(n):
http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
http://www.felix021.com/blog/read.php?2040
class Solution { public: 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) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. string T = preProcess(s); int n = T.length(); int *P = new int[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); } };