Palindrome Partitioning II

Given a string s, partition s such that every substring of the partition is a palindrome.

Return the minimum cuts needed for a palindrome partitioning of s.

For example, given s = "aab",
Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.

这个两个Dp, 一个是对那一部分是palindrome的二维dp。 还有一个是 对cut个数的一维dp。

 1 public class Solution {
 2     int[][] map = null;
 3     public int minCut(String s) {
 4         // IMPORTANT: Please reset any member data you declared, as
 5         // the same Solution instance will be reused for each test case.
 6         map = new int[s.length()][s.length()];
 7         int[] cut = new int[s.length()];
 8         for(int i = 0; i < s.length(); i++)
 9             map[i][i] = 1;
10         for(int i = 0; i < s.length() - 1; i ++){
11             if(s.charAt(i) == s.charAt(i + 1)) map[i][i + 1] = 1;
12             else map[i][i + 1] = -1;
13         }
14         for(int i = 0; i < s.length(); i ++){
15             cut[i] = i;
16             for(int j = i; j < s.length(); j ++){
17                 map[i][j] = checkPartition(s, i, j);
18             }
19         }
20         for(int j = 0; j < s.length(); j ++){
21             for(int i = 0; i < j; i ++){
22                 if(map[i][j] == 1) cut[j] = Math.min(cut[j], 1 + cut[i]);
23             }
24         }
25         return cut[s.length() - 1];
26     }
27     public int checkPartition(String s, int start, int end){
28         if(map[start][end] != 0) return map[start][end];
29         if(s.charAt(start) != s.charAt(end)) return -1;
30         return checkPartition(s, start + 1, end - 1);
31     }
32 }
 1 public class Solution {
 2     public int minCut(String s) {
 3         int leng = s.length();
 4         if(leng == 0 || leng == 1) return 0;
 5         boolean[][] isPal = new boolean[leng][leng];
 6 
 7         int[] dp = new int[leng]; 
 8         for (int i = 0; i < leng; i++) {
 9             dp[i] = leng - 1 - i;
10         }
11 
12         for (int i = leng - 1; i >= 0; --i) {
13             for (int j = i; j < leng; ++j) {
14                 if (s.charAt(i) == s.charAt(j) && (j <= i + 2 || (i + 1 < leng && j - 1 >= 0 && isPal[i + 1][j - 1]))) {
15                     isPal[i][j] = true;
16                     if(j+1 < leng){
17                         dp[i] = Math.min(dp[i], 1 + dp[j + 1]);
18                     }else {
19                         dp[i] = 0;
20                     }
21                 }
22             }
23         }
24 
25         return dp[0];
26     }
27 }
原文地址:https://www.cnblogs.com/reynold-lei/p/3442649.html