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 }
posted on 2013-11-26 09:23 Step-BY-Step 阅读(199) 评论(0) 编辑 收藏 举报