[LeetCode] 132. 分割回文串 II

上一个题的变种,改了一下,果然超时,然后在dfs的时候加一些剪枝,仍然超时。。。

因为太晚了,实在不想自己想了,所以看了下题解,果然是要用动态规划来做。

大致思路是k[0][j]表示,当前从0节点出发,到j节点,最少的分隔数。那么得到k[0][j]的递归公式就是 : Min(k[0][t])+1,t取值范围是[0,j)且f[t+1][j]是一个回文串。其实还是蛮简单的

当开始换成dp思路后,就1A了。

class Solution {
    public int minCut(String s) {
        int n = s.length();
        boolean f[][] = new boolean[n][n];
        for (int i = 0; i < n; i++) {
            f[i][i] = true;
        }

        for (int i = 0; i < n; i++) {
            int l = i - 1;
            int r = i + 1;
            while (l >= 0 && r < n) {
                if (s.charAt(l) == s.charAt(r)) {
                    f[l][r] = true;
                } else {
                    break;
                }
                l--;
                r++;
            }

            l = i;
            r = i + 1;
            while (l >= 0 && r < n) {
                if (s.charAt(l) == s.charAt(r)) {
                    f[l][r] = true;
                } else {
                    break;
                }
                l--;
                r++;
            }
        }

        int k[][] = new int[n][n];
        for (int i = 0; i < n; i++) {
            k[i][i] = 1;
        }
        int i = 0;
        for (int j = 0; j < n; j++) {
            if (f[i][j]) {
                k[i][j] = 1;
            } else {
                for (int t = 0; t < j; t++) {
                    if (k[i][t] > 0 && f[t + 1][j]) {
                        if (k[i][j] == 0) {
                            k[i][j] = k[i][t] + 1;
                        } else {
                            k[i][j] = Math.min(k[i][j], k[i][t] + 1);
                        }
                    }
                }
            }
        }

        return k[0][n - 1] - 1;
    }
}
posted @ 2021-06-07 00:01  ACBingo  阅读(31)  评论(0编辑  收藏  举报