分割回文串 II
阿新 • • 發佈:2021-10-18
給你一個字串 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())); } } }