1. 程式人生 > 其它 >分割回文串 II

分割回文串 II

連結

給你一個字串 s,請你將 s 分割成一些子串,使每個子串都是迴文。

返回符合要求的 最少分割次數 。

import java.util.Scanner;

class Solution {

    private static boolean[][] isOk(String str) {
        int n = str.length();
        boolean[][] dp = new boolean[n][n];

        for (int i = 0; i < n; ++i) {
            dp[i][i] = true;
        }

        for (int i = 1; i < n; ++i) {
            if (str.charAt(i - 1) == str.charAt(i)) {
                dp[i - 1][i] = true;
            }
        }

        for (int i = n - 2; i >= 0; --i) {
            for (int j = i + 2; j < n; ++j) {
                if (str.charAt(i) == str.charAt(j)) {
                    dp[i][j] = dp[i + 1][j - 1];
                }
            }
        }

        return dp;
    }

    public static int partition(String str, int index, boolean[][] ok) {
        if (index == str.length()) {
            return 0;
        }
        int ret = Integer.MAX_VALUE;

        for (int i = index; i < str.length(); ++i) {
            if (ok[index][i]) {
                ret = Math.min(ret, 1 + partition(str, i + 1, ok));
            }
        }

        return ret;
    }

    public static int minCut(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }

        int n = s.length();
        boolean[][] ok = isOk(s);
        int[] dp = new int[n + 1];

        for (int i = n - 1; i >= 0; --i) {
            dp[i] = Integer.MAX_VALUE;
            for (int j = n - 1; j >= i; --j) {
                if (ok[i][j]) {
                    dp[i] = Math.min(dp[i], 1 + dp[j + 1]);
                }
            }
        }

        return dp[0] - 1;

    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(minCut(in.next()));
        }
    }
}
心之所向,素履以往 生如逆旅,一葦以航