当前位置: 首页 > article >正文

【代码随想录Day27】

Day 27 回溯算法03

今日任务

    1. 组合总和
  • 40.组合总和II
  • 131.分割回文串

代码实现

组合总和,直接套模板可解

 public List<List<Integer>> combinationSum(int[] candidates, int target) {
        backtracking(candidates, target, 0);
        return result;
    }

    void backtracking(int[] candidates, int target, int startIndex) {
        if (sum == target) {
            result.add(new ArrayList<>(path));
            return;
        }
        if (sum > target) {
            return;
        }
        for (int i = startIndex; i < candidates.length; i++) {
            path.add(candidates[i]);
            sum+=candidates[i];
            backtracking(candidates, target, i);
            sum-=candidates[i];
            path.remove(path.size() - 1);
        }
    }

组合总和II
这个就有点难,在模板之外要考虑怎么去重

public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        backtracking2(candidates, target, 0, new boolean[candidates.length]);
        return result;
    }

    void backtracking2(int[] candidates, int target, int startIndex, boolean[] used) {
        if (sum == target) {
            result.add(new ArrayList<>(path));
            return;
        }
        if (sum > target) {
            return;
        }
        for (int i = startIndex; i < candidates.length; i++) {
            if (target - sum < candidates[i]) break;
            if ( i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) {
                continue;
            }
            used[i] = true;
            path.add(candidates[i]);
            sum+=candidates[i];
            backtracking2(candidates, target, i + 1, used);
            used[i] = false;
            sum-=candidates[i];
            path.remove(path.size() - 1);
        }

    }

131.分割回文串
这个就太难了,模板还是那个模板,这里难以想到的是,当切割字符串的时候,从第二位开始,就相当于把第1、2位切割为一个字符,也就是说把startIndex当成切割线;至于解法中的动态规划部分,则完全不懂。

    public List<List<String>> partition(String s) {
        List<List<String>> result = new ArrayList<>();
        List<String> path = new ArrayList<>();
        backtracking(s, 0, result, path);
        return result;

    }

    void backtracking(String s, Integer startIndex, List<List<String>> result, List<String> path) {
        if (startIndex >= s.length()) {
            result.add(new ArrayList<>(path));
            return;
        }
        for (int i = startIndex; i < s.length(); i++) {
            String substring = s.substring(startIndex, i + 1);
            if (!isPalindrome(substring)) {
                continue;
            }
            path.add(substring);
            backtracking(s, i + 1, result, path);
            path.remove(path.size() - 1);
        }

    }

    public boolean isPalindrome(String s) {
        for (int i = 0; i < s.length()/2; i++) {
            if (s.charAt(i) != s.charAt(s.length() - i - 1)) {
                return false;
            }
        }
        return true;
    }

今日总结

  1. 有点难,但是模板依然可用,每个题里边都有难以想象到的难点
  2. 大数据?AI?有机会吗?
  3. 今天+2,希望再来两天,2024就回本啦

http://www.kler.cn/a/273979.html

相关文章:

  • Java最新面试题(全网最全、最细、附答案)
  • element-ui 2的级联选择器,回显已存储的子选项名称
  • 轻量级通信协议 JSON-RPC 2.0 详解
  • C语言 递归编程练习
  • Science Robotics让软机器人“活”得更久的3D打印!
  • 【Unity Shader】【图形渲染】Unity Shader操作基础5-Unity Shader调试技巧
  • 网页429:请求过多
  • 探索未来科技:量子计算的前沿与挑战
  • ET框架新起一个服务及实现服务之间的消息通讯
  • java毕业设计 | springboot+vue游戏交流网站(附源码)
  • 中国传统游戏-幻方-c/c++实现
  • 每天一个数据分析题(二百一十五)
  • 【leetcode】动态规划专题
  • html--蝴蝶
  • 生成微信小程序二维码
  • 由浅到深认识C语言(6):变量的存储类型
  • 如何在 docker 容器内部运行 docker命令
  • 活动报名 | 数能涌现,三生万物,长安链发布三周年庆暨生态年会邀您共聚
  • 微信公众号 H5本地调试配置 hosts + nginx + openssl
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Path)
  • AI将如何影响我们的生活?
  • 快速高效地数据分析处理:QtiPlot for Mac中文直装版 兼容M
  • Codeforces Round 932 (Div. 2) D. Exam in MAC【正难则反+容斥原理】
  • 【Unity】CatlikeCoding SRP
  • PHP反序列化--pop链
  • 手势追踪技术在HTC VIVE中的应用与实现