代码随想录训练营二刷第二十八天 | 93.复原IP地址 78.子集 90.子集II

代码随想录训练营二刷第二十八天 | 93.复原IP地址 78.子集 90.子集II

一、93.复原IP地址

题目链接:https://leetcode.cn/problems/restore-ip-addresses/
思路:切分三次到达叶节点,然后判断剩余的是否合法。

class Solution {
    
    List<String> list = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        if (s.length() > 12) return list;
        backTracking(s, 0, 0);
        return list;
    }
    void backTracking(String s, int index, int count) {
        if (count == 3) {
            if (isTrue(s, index, s.length()-1)) {
                list.add(s);
            }
            return;
        }
        for (int i = index; i < s.length(); i++) {
            if (!isTrue(s, index, i)) continue;
            s = s.substring(0, i+1) + '.' + s.substring(i+1);
            count++;
            backTracking(s, i+2, count);
            s = s.substring(0, i+1) + s.substring(i+2);
            count--;
        }
    }
    boolean isTrue(String s, int i, int j) {
        if (i == j) return true;
        if (j - i > 2 || i > j) return false;
        if(s.charAt(i) == '0') return false;
        int sum = 0;
        for (; i <= j; i++) {
            sum += s.charAt(i) - '0';
            if (i < j) sum = sum * 10;
        }
        if (sum >= 0 && sum <= 255) return true;
        return false;
    }
}

二、78.子集

题目链接:https://leetcode.cn/problems/subsets/
思路:子集问题是收集所有节点,即叶子结点和非叶子节点。

class Solution {
    List<List<Integer>> arrayLists = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        backTracking(nums, 0);
        return arrayLists;
    }
    void backTracking(int[] nums, int index) {
        arrayLists.add(new ArrayList<>(list));
        for (int i = index; i < nums.length; i++) {
            list.add(nums[i]);
            backTracking(nums, i + 1);
            list.remove(list.size()-1);
        }
    }
}

三、90.子集II

题目链接:https://leetcode.cn/problems/subsets-ii/
思路:有重复元素,树层去重,得先排序。

class Solution {
    List<List<Integer>> arrayLists = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        backTracking(nums, 0);
        return arrayLists;
    }
    void backTracking(int[] nums, int index) {
        arrayLists.add(new ArrayList<>(list));
        for (int i = index; i < nums.length; i++) {
            if (i > index && nums[i] == nums[i-1]) continue;
            list.add(nums[i]);
            backTracking(nums, i + 1);
            list.remove(list.size()-1);
        }
    }
}

你可能感兴趣的:(力扣算法题,算法,数据结构,回溯)