动态方程:
d[i][j] = (a[i]=a[j])&&d[i+1][j-1]
public String longestPalindrome(String str) {
if (str==null||str.length()==1) {
return str;
}
int len = str.length();
boolean[][] dp = new boolean[len][len]; //默认值是false
String res = str.substring(0,1); //[0,1)
for (int j=0; j<len; j++){
for (int i=0; i<=j; i++){//从i到j,必然i<=j。i在内,也必然先有j。被依赖方在外层,依赖方在内层
char head = str.charAt(i);
char tail = str.charAt(j);
//j-i=0,单个元素,一定回文。
//j-i=1,两个元素相等,一定回文。
//j-i=2,三个元素,两边元素相等,一定回文。
//两边相等,中间回文,一定回文。
dp[i][j] = (head==tail) && (j-i <= 2 || dp[i+1][j-1]);
if (dp[i][j]){
if (j-i+1 > res.length()){
res = str.substring(i, j + 1);
}
}
}
}
return res;
}