给你一个字符串, 输出他的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 }