子集

  1. Input: nums = [1,2,3]
  2. Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
  1. public List<List<Integer>> subsets(int[] nums) {
  2. List<List<Integer>> sets = new ArrayList<>();
  3. List<Integer> set = new ArrayList<>();
  4. for (int i=0; i <= nums.length; i++) {
  5. subset(nums, sets, 0, i, set);
  6. }
  7. return sets;
  8. }
  9. public void subset(int[] nums, List<List<Integer>> sets, int start, final int size, List<Integer> set) {
  10. if (set.size() == size) {
  11. sets.add(new ArrayList<>(set));
  12. return;
  13. }
  14. for (int i = start; i < nums.length; i++) {
  15. set.add(nums[i]);
  16. subset(nums, sets, i + 1, size, set);
  17. set.remove(set.size() - 1);
  18. }
  19. }

子集II

  1. For example, if nums = [1,2,2], a solution is:
  2. [
  3. [2],
  4. [1],
  5. [1,2,2],
  6. [2,2],
  7. [1,2],
  8. []
  9. ]
public List<List<Integer>> subsetsWithDup(int[] nums) {
    Arrays.sort(nums);
    List<List<Integer>> subsets = new ArrayList<>();
    List<Integer> tempSubset = new ArrayList<>();
    boolean[] hasVisited = new boolean[nums.length];
    for (int size = 0; size <= nums.length; size++) {
        backtracking(0, tempSubset, subsets, hasVisited, size, nums); // 不同的子集大小
    }
    return subsets;
}

private void backtracking(int start, List<Integer> tempSubset, List<List<Integer>> subsets, boolean[] hasVisited,
                          final int size, final int[] nums) {

    if (tempSubset.size() == size) {
        subsets.add(new ArrayList<>(tempSubset));
        return;
    }
    for (int i = start; i < nums.length; i++) {
        if (i != 0 && nums[i] == nums[i - 1] && !hasVisited[i - 1]) {
            continue;
        }
        tempSubset.add(nums[i]);
        hasVisited[i] = true;
        backtracking(i + 1, tempSubset, subsets, hasVisited, size, nums);
        hasVisited[i] = false;
        tempSubset.remove(tempSubset.size() - 1);
    }
}

分割字符串子集都是回文数

For example, given s = "aab",
Return
[
  ["aa","b"],
  ["a","a","b"]
]
public List<List<String>> partition(String s) {
    List<List<String>> partitions = new ArrayList<>();
    List<String> tempPartition = new ArrayList<>();
    doPartition(s, partitions, tempPartition);
    return partitions;
}

private void doPartition(String s, List<List<String>> partitions, List<String> tempPartition) {
    if (s.length() == 0) {
        partitions.add(new ArrayList<>(tempPartition));
        return;
    }
    for (int i = 0; i < s.length(); i++) {
        if (isPalindrome(s, 0, i)) {
            tempPartition.add(s.substring(0, i + 1));
            doPartition(s.substring(i + 1), partitions, tempPartition);
            tempPartition.remove(tempPartition.size() - 1);
        }
    }
}

private boolean isPalindrome(String s, int begin, int end) {
    while (begin < end) {
        if (s.charAt(begin++) != s.charAt(end--)) {
            return false;
        }
    }
    return true;
}