image.png

动态规划

image.png

  1. public String longestPalindrome(String s) {
  2. int length = s.length();
  3. String res = "";
  4. boolean[][] dp = new boolean[length][length];
  5. for(int i=length-1;i>=0;i--){
  6. for(int j=i;j<length;j++){
  7. //计算dp
  8. dp[i][j]=s.charAt(i)==s.charAt(j)&&(j-i<3||dp[i+1][j-1]);
  9. //计算最大回文
  10. if(dp[i][j]&&j-i+1>res.length())
  11. res = s.substring(i, j+1);
  12. }
  13. }
  14. return res;
  15. }

中心扩散法

image.png

public String longestPalindrome(String s) {
        if(s.equals(""))
            return "";
        int l = 0;        //记录左边的索引
        int r = 0;      //记录右边的索引
        int maxLength = 0;
        int n = s.length();
        for(int i =0;i<n;i++){
            //对于aba类的情况
            for(int step=0;step<Math.min(i+1,n-i);step++){ //step表示扩展的长度
                if(s.charAt(i-step)!=s.charAt(i+step))
                    break;        //不对称则退出
                if(2*step+1>maxLength){    //记录最大值
                    maxLength = 2*step+1;
                    l = i-step;
                    r = i+step;
                }
            }
            //对于abba类问题
            if(i+1<n&&s.charAt(i)==s.charAt(i+1)){
                //注意下标
                for(int step=0;step<Math.min(i+1,n-i-1);step++){
                    if(s.charAt(i-step)!=s.charAt(i+step+1))
                        break;
                    if(2*step+2>maxLength){   //长度值是不同的
                        maxLength = 2*step+2;
                        l = i-step;
                        r = i+step+1;
                    }
                }
            }
        }
        return s.substring(l,r+1);        //返回最大的子串
    }