第十三章:回溯法

面试题79:所有子集

题目

输入一个没有重复数字的数据集合,请找出它的所有子集。例如数据集合[1, 2]有4个子集,分别是[]、[1]、[2]和[1, 2]。

参考代码

public List<List<Integer>> subsets(int[] nums) {
    List<List<Integer>> result = new LinkedList<>();
    if (nums.length == 0) {
        return result;
    }

    helper(nums, 0, new LinkedList<Integer>(), result);        
    return result;
}

private void helper(int[] nums, int index, 
    LinkedList<Integer> subset, List<List<Integer>> result) {
    if (index == nums.length) {
        result.add(new LinkedList<>(subset));
    } else if (index < nums.length) {
        helper(nums, index + 1, subset, result);

        subset.add(nums[index]);
        helper(nums, index + 1, subset, result);
        subset.removeLast();
    }
}

面试题80:含有k个元素的组合

题目

输入n和k,请输出从1到n里选取k个数字组成的所有组合。例如,如果n等于3,k等于2,将组成3个组合,分别时[1, 2]、[1, 3]和[2, 3]。

参考代码

面试题81:允许重复选择元素的组合

题目

给你一个没有重复数字的正整数集合,请找出所有元素之和等于某个给定值的所有组合。同一个数字可以在组合中出现任意次。例如,输入整数集合[2, 3, 5],元素之和等于8的组合有三个,分别是[2, 2, 2, 2]、[2, 3, 3]和[3, 5]。

参考代码

面试题82:含有重复元素集合的组合

题目

给你一个可能有重复数字的整数集合,请找出所有元素之和等于某个给定值的所有组合。输出里不得包含重复的组合。例如,输入整数集合[2, 2, 2, 4, 3, 3],元素之和等于8的组合有两个,分别是[2, 2, 4]和[2, 3, 3]。

参考代码

面试题83:没有重复元素集合的全排列

题目

给你一个没有重复数字的集合,请找出它的所有全排列。例如集合[1, 2, 3]有6个全排列,分别是[1, 2, 3]、[1, 3, 2]、[2, 1, 3]、[2, 3, 1]、[3, 1, 2]和[3, 2, 1]。

参考代码

面试题84:含有重复元素集合的全排列

题目

给你一个有重复数字的集合,请找出它的所有全排列。例如集合[1, 1, 2]有3个全排列,分别是[1, 1, 2]、[1, 2, 1]和[2, 1, 1]。

参考代码

面试题85:生成匹配的括号

题目

输入一个正整数n,请输出所有包含n个左括号和n个右括号的组合,要求每个组合的左右括号匹配。例如,当n等于2时,有2个符合条件的括号组合,分别是"(())"和"()()"。

参考代码

面试题86:分割回文子字符串

题目

输入一个字符串,要求将它分割成若干子字符串使得每个子字符串都是回文。请列出所有可能的分割方法。例如,输入"google",将输出3中符合条件的分割方法,分别是["g", "o", "o", "g", "l", "e"]、["g", "oo", "g", "l", "e"]和["goog", "l", "e"]。

参考代码

面试题87:恢复IP

题目

输入一个只包含数字的字符串,请列出所有可能恢复出来的IP。例如,输入字符串"10203040",可能恢复出3个IP,分别为"10.20.30.40","102.0.30.40"和"10.203.0.40"。

参考代码

Last updated