Palindrome Partitioning
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s = "aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
暴力解法,复杂度为O(2^n),貌似,反正就是巨高,肯定超时,因此考虑动态规划,第一反应是用一个二维数组记录状态,grid[i][j]表示s.substring(i,j+1)是否为回文字符串,然后再根据这个,用一个数组记录状态,即result[i]表示从i开始到结尾的字串满足题目条件的Palindrome Partitioning结果,则有result[i]可以通过如下方式构造:令j从i+1开始到s.length(),若s.substring(i,j)为回文字符串,则将result[j]的每一个结果前面加上s.substring(i,j),然后加入到result[i]中。由此可以看出,result[i]只与它后面的结果有关,并且grid数组不需要提前计算出来,因此省略,并自底向上计算,也就是首先计算result[s.length()-1]。代码如下:
1 public List<List<String>> partition(String s) { 2 List<List<List<String>>> result = new ArrayList<List<List<String>>>(); 3 result.add(new ArrayList<List<String>>()); 4 if (s == null || s.equals("")) { 5 return result.get(0); 6 } 7 for (int i = s.length() - 1; i >= 0; i--) { 8 List<List<String>> temp = new ArrayList<List<String>>(); 9 for (int j = i + 1; j <= s.length(); j++) { 10 String now = s.substring(i, j); 11 List<List<String>> pre = new ArrayList<List<String>>(); 12 for(List<String> list:result.get(j-i-1)){ 13 pre.add(new ArrayList<>(list)); 14 } 15 if (isPalindrome(now)) { 16 if (pre.size() == 0) { 17 List<String> t = new ArrayList<String>(); 18 t.add(now); 19 pre.add(t); 20 } else { 21 for (List<String> list : pre) { 22 list.add(0, now); 23 } 24 } 25 temp.addAll(pre); 26 } 27 } 28 result.add(0, temp); 29 } 30 return result.get(0); 31 } 32 33 public boolean isPalindrome(String ts) { 34 // TODO Auto-generated method stub 35 if (ts == null || ts.equals("")) { 36 return true; 37 } 38 for (int i = 0; i < ts.length() / 2 + 1; i++) { 39 if (ts.charAt(i) != ts.charAt(ts.length() - 1 - i)) { 40 return false; 41 } 42 } 43 return true; 44 }
这个复杂度是O(n^4)吗?(也就是说外面两层for循环各为n,isPalindrome判断为n,然后遍历result[j]中所有的为n(这个貌似不是n???))o(╯□╰)o