典型动归,从中间逐渐往两边扩展的,用size作外循环
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() == 0) return "";
int n = s.length();
boolean[][] dp = new boolean[n][n];
for (int i = 0; i < n; i++){
dp[i][i] = true;
}
int maxLen = 1;
String ans = s.substring(0, 1);
for (int size = 1; size < n; size++){
for (int i = 0; i + size < n; i++){
int j = i + size;
if ( (size < 2 && s.charAt(i) == s.charAt(j)) || (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) ){
dp[i][j] = true;
maxLen = Math.max(maxLen, j - i + 1);
ans = s.substring(i, j + 1);
}
}
}
return ans;
}
}