class Solution {
public String longestPalindrome(String s) {
int n=s.length();
int [][] dp=new int[n][n];
int i,j,maxlen=0,start=0,end=0;
for(i=0;i<n;i++)
for(j=i;j<n;j++) {
if(i==j)
dp[i][j]=1;
else
dp[i][j]=0;}
for(j=0;j<n;j++) {
for(i=0;i<=j;i++) {
int ij_len=j-i;
if(ij_len==0)
dp[i][j]=1;
else if(ij_len==1)
dp[i][j] = s.charAt(i) == s.charAt(j) ? 2 : 1;
else {
if(s.charAt(i) == s.charAt(j)&&j-i-1 == dp[i+1][j-1])//当两个边界字符相等,而且他们的(i+1,j-1)子串也是回文时dp有效。
dp[i][j]=dp[i+1][j-1]+2;
else
dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);//否则取两个相近子串的最大值。
}
if (dp[i][j] > maxlen) {
maxlen = dp[i][j];
start = i;
end = j;
}
}
}
return s.substring(start, end + 1);
}
}