5. Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
Solution
C++
Sol1
class Solution {
public:
int lo=0,Max=0;
string longestPalindrome(string s) {
for(int i = 0; i < s.length(); ++i) {
isValid(s,i,i);
isValid(s,i,i+1);
}
return s.substr(lo,Max);
}
void isValid(string& s, int m, int n) {
while(m >= 0 && n <= s.length()-1 && s[m] == s[n]) {
--m;
++n;
}
if(n-m-1 > Max) {
Max = n-m-1;
lo = m+1;
}
}
};
Python
Sol2
class Solution:
#Manacher algorithm
#http://en.wikipedia.org/wiki/Longest_palindromic_substring
def longestPalindrome(self, s):
# 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
T = '#'.join('^{}$'.format(s))
n = len(T)
P = [0] * n
C = R = 0
for i in range (1, n-1):
P[i] = (R > i) and min(R - i, P[2*C - i]) # equals to i' = C - (i-C)
# Attempt to expand palindrome centered at i
while T[i + 1 + P[i]] == T[i - 1 - P[i]]:
P[i] += 1
# If palindrome centered at i expand past R,
# adjust center based on expanded palindrome.
if i + P[i] > R:
C, R = i, i + P[i]
# Find the maximum element in P.
maxLen, centerIndex = max((n, i) for i, n in enumerate(P))
return s[(centerIndex - maxLen)//2: (centerIndex + maxLen)//2]
Explanation
Sol1
Time:
O
(
n
2
)
O(n^2)
O(n2)
Sol2: Manacher algorithm
Time:
O
(
n
)
O(n)
O(n)