# 动态规划-5-最长回文子串

Description:

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

Example:

Input: "cbbd"

Output: "bb"

http://www.cnblogs.com/bitzhuwei/p/Longest-Palindromic-Substring-Part-II.html

class Solution {
public String longestPalindrome(String s) {
if(s == null || s.length() == 0) return "";

int len = 2 * s.length() + 3;
int[] P = new int[len];
char[] T = new char[len];

T[0] = '!';
T[1] = '#';
int t = 2;
for(char c : s.toCharArray()){
T[t++] = c;
T[t++] = '#';
}
T[t] = '\$';
//C为中心，R为右边界
int C = 0,R = 0;

for(int i = 1;i < len - 1;i++){
//与i对称的i'
int mirror = 2 * C - i;
//与右边界的距离
int diff = R - i;
//若在右边界和中心内,否则更新中心和右边界
if(diff >= 0){
//若P[mirror] < diff,说明可以利用对称性质,否则更新中心和右边界
if(P[mirror] < diff){
P[i] = P[mirror];
}else{
P[i] = diff;
while(T[i + P[i] + 1] == T[i - P[i] - 1]) P[i]++;
C = i;
R = i + P[i];
}
}else{
while(T[i + P[i] + 1] == T[i - P[i] - 1]) P[i]++;
C = i;
R = i + P[i];
}
}

int maxLength = -1, center = -1;
for(int i = 1;i < len - 1;i++){
if(P[i] > maxLength){
maxLength = P[i];
center = i;
}
}

return s.substring((center -1 - maxLength) / 2,(center - 1 - maxLength) / 2 + maxLength);
}
}