标签:
(Version 0.0)
这道题是在Palindrome Partitioning的基础之上要求找一个最少分割次数的partitioning,因为之前已经做过了Palindrome Partitioning,所以最开始自然想到了用DP记录所有substring是否是palindrome,然后再对每个substring的mincuts用DP方法逐个由短至长求解,但是在LeetCode OJ上面run大数据时会超时,代码如下:
1 public class Solution { 2 public int minCut(String s) { 3 boolean[][] isPalindrome = new boolean[s.length()][s.length()]; 4 int[][] cuts = new int[s.length()][s.length()]; 5 for (int i = 0; i < isPalindrome.length; i++) { 6 isPalindrome[i][i] = true; 7 } 8 for (int l = 2; l <= s.length(); l++) { 9 for (int i = 0; i + l <= s.length(); i++) { 10 int j = i + l - 1; 11 isPalindrome[i][j] = (isPalindrome[i + 1][j - 1] || l == 2) && s.charAt(i) == s.charAt(j); 12 if (!isPalindrome[i][j]) { 13 cuts[i][j] = Integer.MAX_VALUE; 14 for (int k = i; k < j; k++) { 15 cuts[i][j] = Math.min(cuts[i][k] + cuts[k + 1][j] + 1, cuts[i][j]); 16 } 17 } 18 } 19 } 20 return cuts[0][s.length() - 1]; 21 } 22 }
看来需要对上面的代码进行优化,去除一些无用功。原题要求的是整个string的mincut,所以求起始位置不是最开头的substring的mincut其实对于问题的解决没有帮助,应该是可以省去的无用功,所以一个可能的优化是将最内层计算cuts数组元素的循环从计算isPalindrome数组的循环最内层拿出去。
(待续)
[LeetCode] Palindrome Partitioning II
标签:
原文地址:http://www.cnblogs.com/icecreamdeqinw/p/4334176.html