输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

输入: "cbbd"
输出: "bb"

解析:动态规划三步骤。1定义数组,dp[i]j为i到j是否是回文子符串。2初始化,dp[i][i]都是True,默认都是True。3递推公式,dp[i][j]=(charAt(i)==charAt(j))&&dp[i+1][j-1]。终点是dp[0][n-1]。所以从右下角开始。

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        String ans = "";
        boolean[][] dp = new boolean[n+1][n+1];
        for(int i=n-1;i>=0;i--){
            for(int j=i;j<n;j++){//acda,不光需要a==a,还要dp[i+1][j-1]。如果j-i<2说明如aa形式,则不需要这步。
                dp[i][j]=(s.charAt(i)==s.charAt(j)&&(j-i<2||dp[i+1][j-1]));
                //如果i~j是回文的,且长度大于0,则更新。最后得到新的字符串
                if(dp[i][j]&&j-i>=0){
                    ans = s.substring(i,j+1);//substring函数的特性
                }
            }
        }
        return ans;

    }
}