Given a set of characters represented by a String, return a list containing all subsets of the characters.
Assumptions
There could be duplicate characters in the original set.
Examples
Set = "abc", all the subsets are ["", "a", "ab", "abc", "ac", "b", "bc", "c"]
Set = "abb", all the subsets are ["", "a", "ab", "abb", "b", "bb"]
Set = "", all the subsets are [""]
Set = null, all the subsets are []
1 public List<String> subSets(String set) { 2 // Write your solution here. 3 List<String> res = new ArrayList<>(); 4 if (set == null) { 5 return res; 6 } 7 char[] chars = set.toCharArray(); 8 //排列一下,为了去重复 9 Arrays.sort(chars); 10 /* 11 * 使用字典是错误的,因为 AAB 和 ABA 都算是一样的,并没有办法用字典来规范 12 * */ 13 StringBuilder sb = new StringBuilder(); 14 dfs(chars, res, 0, sb); 15 return res; 16 } 17 18 private void dfs(char[] chars, List<String> res, int index, StringBuilder sb) { 19 //base case: reaches the bottom 20 if (index == chars.length) { 21 res.add(sb.toString()); 22 return; 23 } 24 //case 1 : +chars[index] 25 sb.append(chars[index]); 26 dfs(chars, res, index + 1, sb); 27 sb.deleteCharAt(sb.length() - 1); 28 while (index< chars.length -1 && chars[index] == chars[index+1]){ 29 index++ ; 30 } 31 //case 2 : + "" 32 sb.append(""); 33 dfs(chars, res, index + 1, sb); 34 //since added "", no need to remove 35 36 }