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

代码随想录训练营Day19 | 39. 组合总和 - 40.组合总和II - 131.分割回文串

39. 组合总和

  • 题目链接:39. 组合总和
  • 思路:
    1. 和组合总数思路一样,唯一不一样的可以重复选择某一个数,所以回溯函数传递下表参数时不用+1,就可以重复选择
  • 代码:
class Solution {
public:
    vector<vector<int>> combinationSum2(vector<int>& c, int t) {
        vector<vector<int>> ans;
        vector<int> tmp;
        int n = c.size();
        ranges::sort(c); // 排序
        auto dfs = [&](auto&& dfs, int s, int k) {
            if(k == 0) {
                ans.push_back(tmp);
                return;
            }
            if(s == n || k < c[s]) // 退出条件 + 当k值比能选的最小值选的时候 减枝优化
                return;
            for(int i = s; i < n; ++i) {
                tmp.push_back(c[i]);
                dfs(dfs, i, k - c[i]);
                tmp.pop_back();
            }
        };
        dfs(dfs, 0, t);
        return ans;
    }
};

40.组合总和II

  • 题目链接:40.组合总和II
  • 思路:
    1. 和上题一模一样的思路,唯一的不用点,同一个数不能重复选择,回溯函数传递时下表需要+1
    2. 同一个 数字不能重复选择之外,还需要去除掉相同数字,让相同数字每次选择只能选择一次
  • 代码:
class Solution {
public:
    vector<vector<int>> combinationSum2(vector<int>& c, int t) {
        vector<vector<int>> ans;
        vector<int> tmp;
        int n = c.size();
        ranges::sort(c);
        auto dfs = [&](auto&& dfs, int s, int k) {
            if(k == 0) {
                ans.push_back(tmp);
                return;
            }
            if(s == n || k < c[s]) // 退出条件 + 当k值比能选的最小值选的时候 减枝优化
                return;
            for(int i = s; i < n; ++i) {
                if(i != s && c[i] == c[i-1]) // 去掉重复数字,每一次相同数字只能选择一次
                    continue;
                tmp.push_back(c[i]);
                dfs(dfs, i+1, k - c[i]);
                tmp.pop_back();
            }
        };
        dfs(dfs, 0, t);
        return ans;
    }
};

131.分割回文串

  • 题目链接:131.分割回文串
  • 思路:思路同组合是一致的,只不过这里的条件是,每次选择都要保证选择的字符串是回文串,需要写一个回文字符串判断函数
  • 代码:
class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<string> rs;
        vector<vector<string>> ans;
        int n = s.length();
        auto isPalinDromic = [&](string& ss) -> bool { // 判断回文字符串函数
            int i = 0;
            int j = ss.length() - 1;
            while(i < j) {
                if(ss[i++] != ss[j--])
                    return false;
            }
            return true;
        };

        auto dfs = [&](auto&& dfs, int i) {
            if(i == n) {
                ans.push_back(rs); // 符合结果
                return;
            }

            string tmp = "";
            for(int j = i; j < n; ++j) {
                tmp += s[j]; // 添加字符
                if(isPalinDromic(tmp)) { // 判断是否是回文字符串
                    rs.push_back(tmp);
                    dfs(dfs, j + 1);
                    rs.pop_back();
                }
                 
            }
        };

        dfs(dfs, 0);
        return ans;
    }
};

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

相关文章:

  • c# 后台任务自动执行
  • 【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类
  • 图解HTTP-HTTP报文
  • leetcode之hot100---240搜索二维矩阵II(C++)
  • 计算机网络 八股青春版
  • Oracle:数据库的顶尖认证
  • OpenCV视觉分析之目标跟踪(8)目标跟踪函数CamShift()使用
  • 【RESP问题】RESP.app GUI for Redis 连接不上redis服务器
  • AI - 使用LangChain请求LLM结构化生成内容
  • Unet++改进3:添加NAMAttention注意力机制
  • 重新回顾反向传播与梯度下降:训练神经网络的基石
  • Redis安装配置及基本使用(保姆级安装教程非常耐用)
  • 【云原生开发】K8S多集群资源管理平台架构设计
  • 【静态页面】尚品汇 1、设计稿分析及资源准备
  • Nginx 在中小企业的初级应用实操指南
  • 【HCIP园区网综合拓扑实验】配置步骤与详解(未施工完,持续更新中)
  • git撤销commit和add
  • 【YOLO学习】YOLOv8改进举例
  • 深入理解Java虚拟机(JVM):从基础到实战
  • 【p2p、分布式,区块链笔记 Torrent】WebTorrent bittorrent-dht DHT的构造+lookup+announce
  • 领克双十一营销设计:视觉与策略的完美融合
  • Flutter 鸿蒙next中的 Stack 和 Positioned 用法详解
  • 算法练习:1004. 最大连续1的个数 III
  • 基于SSM+VUE守护萌宠宠物网站JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
  • ORACLE 19C 安装数据库补丁的详细过程
  • 利用全排列解决LeetCode第3343题“统计平衡排列的数目”问题