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.
[解题思路]
记录所有合法的回文分割,最后得到最小的回文分割数,Large data TLE
1 public class Solution { 2 public int minCut(String s) { 3 // Start typing your Java solution below 4 // DO NOT write main() function 5 ArrayList<ArrayList<String>> result = partition(s); 6 int minCut = Integer.MAX_VALUE; 7 for(int i = 0; i < result.size(); i++){ 8 if(result.get(i).size() < minCut){ 9 minCut = result.get(i).size(); 10 } 11 } 12 return minCut - 1; 13 } 14 15 public ArrayList<ArrayList<String>> partition(String s) { 16 // Start typing your Java solution below 17 // DO NOT write main() function 18 ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>(); 19 ArrayList<String> output = new ArrayList<String>(); 20 int depth = 0, len = s.length(); 21 22 palinPartition(s, 0, len, output, result); 23 return result; 24 } 25 26 public void palinPartition(String s, int start, int len, ArrayList<String> output, 27 ArrayList<ArrayList<String>> result){ 28 if(start == len){ 29 ArrayList<String> tmp = new ArrayList<String>(); 30 tmp.addAll(output); 31 result.add(tmp); 32 return; 33 } 34 35 for(int i = start; i < len; i++){ 36 if(isPalindrome(s, start, i)){ 37 output.add(s.substring(start, i + 1)); 38 palinPartition(s, i + 1, len, output, result); 39 output.remove(output.size() - 1); 40 } 41 } 42 43 } 44 45 public boolean isPalindrome(String s, int start, int end){ 46 while(start < end){ 47 if(s.charAt(start) != s.charAt(end)){ 48 return false; 49 } 50 start ++; 51 end --; 52 } 53 54 return true; 55 } 56 }
updated:
using DP
Let F(i) = min cut for s[i]…s[n-1] so F(0) is our answer and we have:
F(i) = min(1 + F(j)) for j = i + 1, … n-1 and s[i]…s[j-1] is palidromic
F(i) = 0 if s[i]…s[n-1] is palindromic
1 public static int minCut(String s) { 2 // Start typing your Java solution below 3 // DO NOT write main() function 4 if (s == null) { 5 return 0; 6 } 7 int len = s.length(); 8 int[] cuts = new int[len]; 9 for (int i = len - 1; i >= 0; i--) { 10 String str = s.substring(i); 11 if (isPalindrome(str)) { 12 cuts[i] = 0; 13 } else { 14 cuts[i] = getMin(s, i, len, cuts); 15 } 16 } 17 return cuts[0]; 18 } 19 20 public static int getMin(String s, int i, int len, int[] cuts) { 21 int min = Integer.MAX_VALUE; 22 for (int j = i + 1; j < len; j++) { 23 if (cuts[j] < min && isPalindrome(s.substring(i, j))) { 24 min = cuts[j]; 25 } 26 } 27 return min + 1; 28 } 29 30 public static boolean isPalindrome(String s) { 31 int len = s.length(); 32 int i = 0, j = len - 1; 33 while (i < j) { 34 if (s.charAt(i) != s.charAt(j)) { 35 return false; 36 } 37 i++; 38 j--; 39 } 40 return true; 41 }
"a" 0 0 "ab" 1 1 "bb" 0 0 "cdd" 1 1 "dde" 1 1 "efe" 0 0 "fff" 0 0 "abbab" 1 1 "leet" 2 2 "coder" 4 4 "abcccb" 1 1 "cabababcbc" 3 3 "cbbbcc" 1 1 "ccaacabacb" 3 3 "racecar" 0 0 "danaranad" 0 0 "ababbbabbaba" 3 3 "amanaplanacanalpanama" 0 0 "seeslaveidemonstrateyetartsnomedievalsees" 0 0 "eegiicgaeadbcfacfhifdbiehbgejcaeggcgbahfcajfhjjdgj" 42 42 "kwtbjmsjvbrwriqwxadwnufplszhqccayvdhhvscxjaqsrmrrqngmuvxnugdzjfxeihogzsdjtvdmkudckjoggltcuybddbjoizu" 89 89 "ltsqjodzeriqdtyewsrpfscozbyrpidadvsmlylqrviuqiynbscgmhulkvdzdicgdwvquigoepiwxjlydogpxdahyfhdnljshgjeprsvgctgnfgqtnfsqizonirdtcvblehcwbzedsmrxtjsipkyxk" 143 143 "ababababababababababababcbabababababababababababa" 0 0 "fifgbeajcacehiicccfecbfhhgfiiecdcjjffbghdidbhbdbfbfjccgbbdcjheccfbhafehieabbdfeigbiaggchaeghaijfbjhi" 75 75 "apjesgpsxoeiokmqmfgvjslcjukbqxpsobyhjpbgdfruqdkeiszrlmtwgfxyfostpqczidfljwfbbrflkgdvtytbgqalguewnhvvmcgxboycffopmtmhtfizxkmeftcucxpobxmelmjtuzigsxnncxpaibgpuijwhankxbplpyejxmrrjgeoevqozwdtgospohznkoyzocjlracchjqnggbfeebmuvbicbvmpuleywrpzwsihivnrwtxcukwplgtobhgxukwrdlszfaiqxwjvrgxnsveedxseeyeykarqnjrtlaliyudpacctzizcftjlunlgnfwcqqxcqikocqffsjyurzwysfjmswvhbrmshjuzsgpwyubtfbnwajuvrfhlccvfwhxfqthkcwhatktymgxostjlztwdxritygbrbibdgkezvzajizxasjnrcjwzdfvdnwwqeyumkamhzoqhnqjfzwzbixclcxqrtniznemxeahfozp" 452 452 "adabdcaebdcebdcacaaaadbbcadabcbeabaadcbcaaddebdbddcbdacdbbaedbdaaecabdceddccbdeeddccdaabbabbdedaaabcdadbdabeacbeadbaddcbaacdbabcccbaceedbcccedbeecbccaecadccbdbdccbcbaacccbddcccbaedbacdbcaccdcaadcbaebebcceabbdcdeaabdbabadeaaaaedbdbcebcbddebccacacddebecabccbbdcbecbaeedcdacdcbdbebbacddddaabaedabbaaabaddcdaadcccdeebcabacdadbaacdccbeceddeebbbdbaaaaabaeecccaebdeabddacbedededebdebabdbcbdcbadbeeceecdcdbbdcbdbeeebcdcabdeeacabdeaedebbcaacdadaecbccbededceceabdcabdeabbcdecdedadcaebaababeedcaacdbdacbccdbcece" 273 273 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 1 1
已范错误:
line 23:
if (cuts[j] < min && isPalindrome(s.substring(i, j - 1)))
这里应是s.substring(i, j),表示i到j-1之间的字符串。
getMin函数的含义是:在i+1~n-2之间砍一刀,看之间的字符串是否是回文,如是则看看是否是最小值,如是则更新
可以改进的地方:
判断是否是回文也可以用dp来解
updated:2013/10/06
上面的解法的时间复杂度为O(n^3),值得优化的地方在判断字符串是否是回文,这个地方会有重复计算
1.计算字符串的所有子串是否是回文,DP解
i.长度为1的子串都是回文
ii.长度为2的子串:s[i]==s[j]
iii.长度为其他的子串:s[i]==s[j] && matrix[i+1][j-1]
2.计算minCut,DP和上面相同
1 public static int minCut(String s) { 2 if (s == null || s.length() <= 1) { 3 return 0; 4 } 5 6 int len = s.length(); 7 int[] dp = new int[len]; 8 boolean[][] palindromeMatrix = new boolean[len][len]; 9 for (int i = 0; i < len; i++) { 10 palindromeMatrix[i][i] = true; 11 } 12 13 // DP to check every substring of s is palindrome or not? 14 // substring length start from 2 to n 15 for (int L = 2; L <= len; L++) { 16 for (int i = 0; i < len - L + 1; i++) { 17 int j = i + L - 1; 18 if (L == 2) { 19 palindromeMatrix[i][j] = (s.charAt(i) == s.charAt(j)); 20 } else { 21 palindromeMatrix[i][j] = (s.charAt(i) == s.charAt(j) && palindromeMatrix[i + 1][j - 1]); 22 } 23 } 24 } 25 26 for (int i = len - 1; i >= 0; i--) { 27 if(palindromeMatrix[i][len - 1]){ 28 dp[i] = 0; 29 } else { 30 int min = Integer.MAX_VALUE; 31 for (int k = i + 1; k < len; k++) { 32 if(palindromeMatrix[i][k - 1]) 33 min = Math.min(min, 1 + dp[k]); 34 } 35 dp[i] = min; 36 } 37 } 38 return dp[0]; 39 }
陈立人的博客里面说到:不太明白如何构建树来解决这个问题http://www.ituring.com.cn/article/57155
回文字串判断完毕之后,改如何计算最少分割呢?我们可以根据P构建一棵树,然后宽度有限遍历,找到树的最小深度。上面判断回文的时间复杂度为 O(n^2),构建树的时间复杂度为遍历一次P,时间复杂度也是O(n^2),最后树的遍历,时间复杂度要小于O(n^2),这样,整体的时间复杂度为 O(n^2)。