判断回文串(动态规划,必背)

316 阅读1分钟
//动态规划是回文串的万金油解法。
//可以求出所有回文串的数量,可以求最长回文串等等,
//因为dp[i][j]保存了每一种字符串是不是回文串
 public static boolean isPalindrome(int num) {
        char[] arr = String.valueOf(num).toCharArray();
        int n = arr.length;
        //用dp做
        //dp[i][j]代表arr[i]到arr[j]是否是回文串
        boolean[][] dp = new boolean[n][n];
        //1.初始化
        //先初始化每一个字符
        for (int i = 0; i < n; i++) {
            dp[i][i] = true;
        }
        //再判断相邻的字符
        for (int i = 0; i < n - 1; i++) {
            dp[i][i + 1] = arr[i] == arr[i + 1];
        }
        //状态转移
        //dp[i][j]依赖于dp[i+1][j-1]
        for (int i = n-1; i >= 0; i--) {
            //相邻的已经判断过了,需要从j=i+2开始判断
            for (int j = i + 2; j < n; j++) {
                dp[i][j] = dp[i + 1][j - 1] && arr[i] == arr[j];
            }
        }
        return dp[0][n - 1];

    }