Leetcode005
Longest Palindromic Substring问题
知识更新:动态规划、Manacher算法
方法1:动态规划方法
string longestPalindrome(string s) {
if (s.length() <= 1) return s;
bool isPalindrome[1001][1001];
memset(isPalindrome, false, sizeof(isPalindrome));
for (int i = 0; i < s.length(); i++)
isPalindrome[i][i] = true;
int max_head = 0, max_len = 0;
for (int j = 1; j < s.length(); j++)
{
for (int k = 0; k < j; k++)
{
isPalindrome[k][j] = (j - k) < 2 ?
(s[k] == s[j]) : (isPalindrome[k + 1][j - 1] && s[k] == s[j]);
if (isPalindrome[k][j])
if (j - k + 1 > max_len)
{
max_len = j - k + 1;
max_head = k;
}
}
}
return s.substr(max_head, max_len);
}
方法2:Manacher算法
代码来源及思想:
http://articles.leetcode.com/longest-palindromic-substring-part-ii/
private:
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;
}
public:
string longestPalindrome(string s) {
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);
}
注意问题:动态规划的递推式推导和Manacher算法核心思想