最长回文子串 动态规划

 public static String longestPalindrome(String s) {

 

        int length = s.length();

        boolean[][] dp = new boolean[length][length];

  //当前回文子串的最大长度

        int maxLen = 1;

        //最长回文子串的左角标

        int left = 0;

        //最长回文子串的右角标

        int right = 0;

  //先处理边界值

        dp[length-1][length-1] = true;

        for (int i = 0; i < length-1; i++) {

         //对角线

            dp[i][i] = true;

            //次对角线

            dp[i][i+1] = s.charAt(i)==s.charAt(i+1);

            //判断次对角线中是否含有最终答案

            if(dp[i][i+1]){

                maxLen = 2;

                left = i;

                right = i+1;

            }

        }

 

 

        for (int j = 2; j < length; j++) {

            for (int i = 0; i <= j-2; i++) {

             //当前两个字符是否相等

                if(s.charAt(i)==s.charAt(j)){

                 //如果相等只需要取子串对应的值

                    dp[i][j] = dp[i+1][j-1];

                }else {

                 //如果不相等,那么当前肯定不是回文子串

                    dp[i][j] = false;

                }

                //判断是否最长

                if(dp[i][j] && j-i+1>maxLen){

                    maxLen = j-i+1;

                    left = i;

                    right = j;

                }

            }

        }

        return s.substring(left,right+1);

    }

 

 

你可能感兴趣的:(算法)