给你一个字符串, 输出他的pattitioning 都是 palindrome 的组合

Input: "aab"
Output:
[
  ["aa","b"],
  ["a","a","b"]
]

 和93 题实际上一样, 给你个字符串长度比较是 3,  你相当于有一个nums = {1,2,3} 的数组,每次去取 一个数求和,当和的长度恰好等于 字符串长度 并且都是palindrome 时就是结果。

但这道题不能先 把长度数组求出来 再去判断是否符合要求, 比如 先求出 [1,1,1] 这样的长度数组,再判断就会TLE, 因为大部分字符都是不符合palindrome 的,所以产生一个长度就判断是否palindrome 不符合要求就continue才不会TLE。 

以下当input = "seeslaveidemonstrateyetartsnomedievalsees" 会TLE。 

 1 class Solution {
 2     public List<List<String>> partition(String s) {
 3         int[] nums = new int[s.length()];
 4         for(int i=1; i<=s.length(); i++) nums[i-1] = i;
 5         List<List<String>> result = new ArrayList<>();
 6         dfs(new ArrayList<>(), nums, result,s,s.length());
 7         return result;
 8         
 9     }
10     
11     private void dfs(List<Integer> curResult, int[] nums, List<List<String>> result, String s, int remain){
12         if(remain == 0){
13           List<String> cur = new ArrayList<>();  
14           boolean flag = false;  
15           int start = 0;
16           int end = 0;  
17           for(int num: curResult){
18               end += num;
19               String substr = s.substring(start,end);
20               if(!isValid(substr)) return;
21               cur.add(substr);
22               start = end;
23           } 
24           result.add(cur);  
25           return;  
26         }
27         
28         if(remain <0) return;
29         
30         for(int i=0; i<nums.length;i++){
31            curResult.add(nums[i]) ;
32            dfs(curResult,nums,result,s,remain-nums[i]);
33            curResult.remove(curResult.size()-1);
34         }
35     }
36     
37 
38     private boolean isValid(String s){
39         int len = s.length();
40         for(int i=0; i<len/2;i++){
41             if(s.charAt(i) != s.charAt(len-i-1)) return false;
42         }
43         return true;
44     }    
45 }

 

改进后的code:  这段code 一开始对于 "efe" 怎么 都产生不了 "efe"自身这个output, 然后发现for 循环里i 怎么都达不到 2 .

                         原因在于 31行用了 return 而不是continue , 对于DFS 真正能return 是在 达到了叶子节点时,如果该节点还有兄弟节点,return 则会导致 不继续访问兄弟节点。对于 26行,应该用return 而不是continue, 虽然continue 可以work,但改成return 效率会提升很多。

 

 1 class Solution {
 2     public List<List<String>> partition(String s) {
 3         int[] nums = new int[s.length()];
 4         for(int i=1; i<=s.length(); i++) { nums[i-1] = i;}
 5         
 6         List<List<String>> result = new ArrayList<>();
 7         dfs(new ArrayList<>(), nums, result,s,0);
 8         return result;
 9         
10     }
11     
12     private void dfs(List<String> curResult, int[] nums, List<List<String>> result, String s, int start){
13        
14         if(start == s.length()){
15              result.add(new ArrayList<>(curResult));  
16              return;
17           } 
18         
19         if(start >s.length()) return;
20         
21      
22         
23         for(int i=0; i<nums.length ;i++){
24          
25           
26            if(start+nums[i]>s.length()) continue;
27            
28            String substr = s.substring(start,start+nums[i]);
29         
30            if(!isValid(substr)) {
31              continue;  
32            } 
33            curResult.add(substr); 
34            start += nums[i];
35            dfs(curResult,nums,result,s,start); 
36            curResult.remove(curResult.size()-1);
37            start -= nums[i];    
38         }
39     }
40     
41 
42     private boolean isValid(String s){
43         int len = s.length();
44         for(int i=0; i<len/2;i++){
45             if(s.charAt(i) != s.charAt(len-i-1)) return false;
46         }
47         return true;
48     }    
49 }

 

posted on 2018-11-15 03:11  KeepAC  阅读(109)  评论(0编辑  收藏  举报