代码随想录算法训练营第二十七天| 78.子集| 90.子集II131.分割回文串

78.子集|

// 将box状态添加到答案中
void append(List<Integer> box, List<List<Integer>> answer) {
    answer.add(new ArrayList<>());
    for (Integer x : box) {
        answer.get(answer.size() - 1).add(x);
    }
}

void backTrace(int[] A,
               int start, /* 第i个人 */
               List<Integer> box,
        /* 箱子的状态 */
               List<List<Integer>> all) {
    // 总的宝石数
    final int N = A == null ? 0 : A.length;
    // 把当前箱子的状态放到结果中,因为要的是所有的子集
    append(box, all);
    // 如果我是最后一个人,并且没有东西给我选了/ 那么原样返回箱子
    if (start >= N) {
        return;
    }
    // 我还是有宝石可以选择的。
    for (int j = start; j < N; j++) {
        box.add(A[j]);
        // /注意这里结论1的使用,所以这里要写[i + 1,end)
        backTrace(A, j + 1, box, all);
        box.remove(box.size() - 1);
    }
}

public List<List<Integer>> subsets(int[] A) {
    final int N = A == null ? 0 : A.length;
    List<Integer> box = new ArrayList<>(0);
    List<List<Integer>> ans = new ArrayList<>(0);
    backTrace(A, 0, box, ans);
    return ans;
}

 90.子集II

public static List<List<Integer>> subsetsWithDup(int[] nums) {
    List<Integer> path = new ArrayList<>();
    List<List<Integer>> ans = new ArrayList<>();
    Arrays.sort(nums);
    dfs(nums, 0, path, ans);
    return ans;
}

public static void dfs(int[] nums, int index, List<Integer> path, List<List<Integer>> ans) {
    if (!ans.contains(path)) {
        ans.add(new ArrayList<>());
        for (Integer integer : path) {
            ans.get(ans.size() - 1).add(integer);
        }
        if (index >= nums.length) {
            return;
        }
    }


    for (int i = index; i < nums.length; i++) {
        path.add(nums[i]);
        dfs(nums, i + 1, path, ans);
        path.remove(path.size() - 1);
    }

}

131.分割回文串

public List<List<String>> partition(String s) {
    List<String> path = new ArrayList<>();
    List<List<String>> ans = new ArrayList<>();
    char[] chars = s.toCharArray();
    dfs3(chars, 0, path, ans);
    return ans;
}

public void dfs3(char[] nums, int index, List<String> path, List<List<String>> ans) {
    if (index == nums.length) {
        ans.add(path);
        return;
    }
    if (index > nums.length) {
        return;
    }

    for (int i = index; i < nums.length; i++) {
        ArrayList<String> strings = new ArrayList<>(path);
        strings.add(String.valueOf(nums[i]));
        if (isvalid(strings)) {
            path.add(String.valueOf(nums[i]));
            dfs3(nums, i, path, ans);
            path.remove(path.size() - 1);
        }

    }
}

public Boolean isvalid(List<String> strings) {
    for (String string : strings) {
        StringBuilder buffer = new StringBuilder(string);
        String newString = buffer.reverse().toString();
        if (!newString.equals(string)) {
            return false;
        }
    }
    return true;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值