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

 

posted @ 2014-06-16 22:58  秋风一片叶  阅读(153)  评论(0编辑  收藏  举报