力扣爆刷第124天之回溯五连刷

力扣爆刷第124天之回溯五连刷(分割回文、复原IP、子集)

一、131. 分割回文串

题目链接:https://leetcode.cn/problems/palindrome-partitioning/description/
思路:常规组合题,需要起始位置,然后只需要在向下递归的时候判断一下是否是回文,是回文就递归不是就不递归。

class Solution {
    List<List<String>> resList = new ArrayList<>();
    List<String> list = new ArrayList<>();
    public List<List<String>> partition(String s) {
        backTracking(s, 0);
        return resList;
    }
    
    void backTracking(String s, int index) {
        if(index == s.length()) {
            resList.add(new ArrayList(list));
            return ;
        }
        for(int i = index; i < s.length(); i++) {
            if(isTrue(s, index, i)) {
                list.add(s.substring(index, i+1));
                backTracking(s, i+1);
                list.remove(list.size()-1);
            }
        }
    }

    boolean isTrue(String s, int x, int y) {
        while(x < y) {
            if(s.charAt(x) != s.charAt(y)) {
                return false;
            }
            x++;
            y--;
        }
        return true;
    }
}

二、93. 复原 IP 地址

题目链接:https://leetcode.cn/problems/restore-ip-addresses/description/
思路:也是典型的组合问题,和上一题类似,都需要在向下递归的时候进行元素是否需要收集的判断,需要的话才递归。

class Solution {
    List<String> resList = new ArrayList<>();
    List<String> list = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        backTracking(s, 0);
        return resList;
    }
    
    void backTracking(String s, int index) {
        if(list.size() == 4) {
            if(index == s.length()) {
                resList.add(String.join(".", list));
            }
            return ;
        }
        for(int i = index; i < s.length(); i++) {
            if(list.size() == 3 && i - index > 2) return;
            String str = isTrue(s, index, i);
            if(str != null) {
                list.add(str);
                backTracking(s, i+1);
                list.remove(list.size()-1);
            }
        }
    }

    String isTrue(String s, int x, int y) {
        if(y - x > 2) return null;
        if(y - x >= 1 && s.charAt(x) == '0') return null;
        String ss = s.substring(x, y+1);
        Integer i = Integer.valueOf(ss);
        if(i >= 0 && i <= 255) return ss;
        return null;
    }
}

三、78. 子集

题目链接:https://leetcode.cn/problems/subsets/description/
思路:常规组合,元素无重,只不过收集节点时,需要收集全部节点,包括非叶子节点和叶子节点。

class Solution {
    List<List<Integer>> resList = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        backTracking(nums, 0);
        return resList;
    }
    void backTracking(int[] nums, int start) {
        resList.add(new ArrayList(list));
        for(int i = start; 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/description/
思路:和上一题类似,不同的地方是集合有重复元素,但好消息是可以排序,这样就可以横向去重,利用相邻元素相同。
相同的地方就是都是全部节点收集。

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

五、91. 非递减子序列

题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/description/
思路:求非递减子序列,不能排序,集合有重复元素,要达到横向去重,需要使用set,每次递归向下都是一个新的set,横向for循环是同一个。

class Solution {
    List<List<Integer>> resList = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> findSubsequences(int[] nums) {
        backTracking(nums, 0);
        return resList;
    }

    void backTracking(int[] nums, int start) {
        if(list.size() > 1) {
            resList.add(new ArrayList(list));
        }
        Set<Integer> set = new HashSet<>();
        for(int i = start; i < nums.length; i++) {
            if(list.size() > 0 && nums[i] < list.get(list.size()-1)) continue;
            if(set.contains(nums[i])) continue;
            set.add(nums[i]);
            list.add(nums[i]);
            backTracking(nums, i+1);
            list.remove(list.size()-1); 
        }
    }
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
要在VS Code上力扣(LeetCode)题目,首先需要进行以下几步操作: 1. 安装VS Code插件:在VS Code中搜索并安装LeetCode插件。这个插件可以提供LeetCode题目的在线编写和提交功能,以及自动测试和调试代码的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【史上最强代码编辑器VS Code】之VS Code力扣(LeetCode)题目](https://blog.csdn.net/weixin_44553006/article/details/105183522)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [在 vscode 上力扣 Leetcode 可以这样来](https://blog.csdn.net/u012190388/article/details/121277555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [leetcode答案-algo-study:从零开始力扣(LeetCode),JavaScript语言,算法](https://download.csdn.net/download/weixin_38680764/19920528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当年拼却醉颜红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值