代码随想录算法训练营第二十一天| 39. 组合总和, 40.组合总和II, 131.分割回文串

news2024/9/21 22:50:19

今天是回溯算法学习的第二天,主要的学习内容包括:1.组合问题的重复使用 2.组合问题的去重 3.分割问题的处理方法。


39. 组合总和

题目链接:39. 组合总和 - 力扣(LeetCode)

这个组合问题的特点是,集合内的元素可以重复使用。与前面组合问题的区别在于,在每一次回溯中,不是从i+1的位置开始穷举,而是从i开始穷举。这样就满足元素重复使用的要求。对于剪枝操作,这个题的做法是如果求和的结果已经大于目标值,后面的操作就不需要了,可以直接进行回溯了。具体代码实现如下所示:
 

class Solution {
public:
vector<int> vec;
vector<vector<int>> result;
    void backtracking(vector<int>& candidates,int target,int sum,int startindex)
    {
        if(sum==target)
        {
            //sort(vec.begin(),vec.end());
            //result.erase(unique(result.begin(),result.end()),result.end());
            result.push_back(vec);
            return;
        }
        if(sum>target)
        {
            return;
        }
        for(int i=startindex;i<candidates.size()&&sum+candidates[i]<=target;i++)
        {
            vec.push_back(candidates[i]);
            backtracking(candidates,target,sum+candidates[i],i);
            vec.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        backtracking(candidates,target,0,0);
        return result;
    }
};

40.组合总和II

题目链接:40. 组合总和 II - 力扣(LeetCode)

这个组合问题的难点在于有重复值的元素,但是每个元素只能使用一次。这就出现了一个问题,比如数组【1,1,2】,目标为3,直接回溯的话会出现两个【1,2】的组合,但这样是不允许的。所以我们需要对结果进行一个去重操作。

去重操作的逻辑是这样的,随想录将这种去重命名为树层去重。还是用【1,1,2】为例,在同一层的遍历过程中,当第一个1已经和后面的数递归完成了组合时,第二个1再做组合一定会出现相同的结果,那么我们将第二个1的递归结果进行去重。判断的逻辑是这个数和相邻元素相同并且递归过程中相邻元素没有被使用。下面的图可以更好的解释这一过程。

所以这道题就是需要在组合问题的基础上加上对同一层相同元素的去重。具体实现代码如下:

class Solution {
public:
vector<int> vec;
vector<vector<int>> result;
void backtracking(vector<int>& candidates,int target,int sum,int startindex,vector<bool>& used)
{
    if(sum>target) return;
    if(sum==target)
    {
        result.push_back(vec);
        return;
    }
    for(int i=startindex;i<candidates.size()&&sum+candidates[i]<=target;i++)
    {
        if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==0) continue;
        vec.push_back(candidates[i]);
        used[i]=1;
        backtracking(candidates,target,sum+candidates[i],i+1,used);
        used[i]=0;
        vec.pop_back();
    }
}
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
       vector<bool> used(candidates.size(),false);
        backtracking(candidates,target,0,0,used);
        return result;
    }
};

 也可以使用startindex进行直接的去重,但是使用used数组会更加容易理解。
 

class Solution {
public:
vector<int> vec;
vector<vector<int>> result;
void backtracking(vector<int>& candidates,int target,int sum,int startindex)
{
    if(sum>target) return;
    if(sum==target)
    {
        result.push_back(vec);
        return;
    }
    for(int i=startindex;i<candidates.size()&&sum+candidates[i]<=target;i++)
    {
        if(i>startindex&&candidates[i]==candidates[i-1]) continue;
        vec.push_back(candidates[i]);
        backtracking(candidates,target,sum+candidates[i],i+1);
        vec.pop_back();
    }
}
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        backtracking(candidates,target,0,0);
        return result;
    }
};

131.分割回文串

题目链接:131. 分割回文串 - 力扣(LeetCode)

这个题目是一个难题。题目的要求是对一个字符串进行切割,被切割的子串都要满足是一个回文子串。需要求解所有的切割方案。

那么这个题目的做法是使用startindex作为切割点,当startindex与原字符串长度相同,就可以返回所有的切割结果;在for循环遍历过程中,对于每一个i需要判断是否是回文子串,把正确的结果放入一个数组中,并进行递归和回溯。具体代码实现如下:
 

class Solution {
public:
    vector<string> vec;
    vector<vector<string>> result;
    void backtracking(string& s,int startindex)
    {
        if(startindex>=s.size())
        {
            result.push_back(vec);
            return;
        }
        for(int i=startindex;i<=s.size();i++)
        {
            if(ispar(s,startindex,i)==0) continue;
            string temp=s.substr(startindex,i-startindex+1);
            vec.push_back(temp);
            backtracking(s,i+1);
            vec.pop_back();
        }
        
    }
    bool ispar(string s,int start,int end)
    {
        int mid=(end-start)/2;
        for(int i=0;i<=mid;i++)
        {
            if(s[start+i]!=s[end-i]) return false;
        }
        return true;
    }
    vector<vector<string>> partition(string s) {
        backtracking(s,0);
        return result;

    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1967223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java:基于TextRank算法的自动摘要(自动生成事件摘要)

TextRank 是一种用于文本摘要的自然语言处理算法。它的工作原理类似于 Google 搜索引擎的 PageRank 算法&#xff0c;即根据文本中每个单词出现的频率和被引用的次数来评估它的重要性。 所谓自动摘要&#xff0c;就是从文章中自动抽取关键句。何谓关键句&#xff1f;人类的理解…

最好用的复制粘贴软件pastemate功能简介

这应当是windows下最好用的复制粘贴软件&#xff0c;遥遥领先的复制粘贴软件。 效增PasteMate - 下载页面 windows下界面最优美&#xff0c;操作最方便的复制粘贴神器&#xff0c;学生党论文必备&#xff0c;效率神器 pastemate 1.搜索功能&#xff0c;能够按文本、图片、文件…

C# 构建观测者模式(或者为订阅者模型)

前言&#xff1a; 观测者模型的基本理念&#xff0c;就是&#xff0c;我有一个公共的事件&#xff0c;定义好他的事件的触发、数据接口。然后&#xff0c;通过增加订阅者&#xff08;实例&#xff09;来订阅这个事件的&#xff0c;或者说观察这个事件。如果事件发生&#xff0…

软件测试的挑战和压力

软件测试过程中可能会遇到很多挑战&#xff0c;比如&#xff1a; 1. 需求不明确或不稳定。如果需求文档不完整、不清晰或不一致&#xff0c;或者需求在开发过程中频繁变更&#xff0c;那么测试人员就很难设计和执行有效的测试用例&#xff0c;也很难判断测试结果是否符合预期。…

5年经验的软件测试人员,碰到这样的面试题居然会心虚......

我们这边最近的面试机会比较多&#xff0c;但是根据他们的反馈&#xff0c;结束后大部分都没音信了&#xff0c;因为现在企业面试问的非常多&#xff0c;范围非常广&#xff0c;而且开放性的问题很多&#xff0c;很多人即便面试前刷了成百上千道面试题&#xff0c;也很难碰到一…

C语言——指针数组

文章目录 &#x1f34a;自我介绍&#x1f34a;前言&#x1f34a;含义&#x1f34a;输出指针数组中的值&#x1f34a;指针数组工程的用法&#xff08;模拟linux的内核代码&#xff09; 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&…

实习中学到的一点计算机知识(MP4在企业微信打不开?)

我在实习中&#xff0c;常有同事向我反馈说我在微信发的视频格式打不开。这就导致我还要一帧帧的盯着某一个时刻来截图&#xff0c;今天查了一下资料尝试修改视频后缀来解决视频的播放问题。 在网上下载mp4的格式&#xff0c;在本地都能播放&#xff0c;怎么可能发上企业微信就…

使用CLI脚手架搭建Vue2项目

一、配置前端的环境 1、下载安装Node.js 网址&#xff1a;Node.js 中文网 (nodejs.com.cn) 参考&#xff1a;【简明图文教程】Node.js的下载、安装、环境配置及测试_node下载安装-CSDN博客 推荐安装路径C盘改为D盘 2、配置nodejs及环境变量【安装的时候勾选Add to PATH就不…

[算法]归并排序(C语言实现)

一、归并排序的定义 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。 二、归并排序的算法原理 归并排序的算法可以用递归法和非递归法来实现…

2024新版python安装教程【附图片】

Python的安装步骤因操作系统而异&#xff0c;但大致可以分为下载、安装和验证三个主要步骤。以下是Windows系统中Python的详细安装步骤&#xff1a; Windows系统 下载Python安装包 访问Python官网&#xff08;https://www.python.org/&#xff09;。点击页面头部的“Download…

【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管理员三种

随着信息技术的迅猛发展&#xff0c;传统的医院挂号管理方式面临着效率低下、排队时间长、信息不对称等诸多问题。这些问题不仅影响患者的就医体验&#xff0c;也加重了医院工作人员的负担。在此背景下&#xff0c;基于Python的医院挂号管理系统应运而生。该系统旨在通过信息化…

OZON饰品产品什么好卖,OZON热销饰品有哪些

在OZON平台上&#xff0c;饰品产品的销售情况受多种因素影响&#xff0c;包括市场需求、季节变化、消费者偏好以及流行趋势等。以下是一些可能热销的OZON饰品产品类别及具体推荐&#xff1a; OZON热销饰品地址&#xff1a;D。DDqbt。COm/74rDTop1 发带套装 Утика Ком…

Idea常用快捷键:设置自动导包、格式化、抽取方法

Idea设置自动导包 【File】→【Setting】(或使用快捷键【Crlt Shift S】)打开Setting设置。点击【Editor】→【General】→【Auto Import】。勾选自定导包的选项&#xff0c;并确定&#xff0c;如下&#xff1a; Addunambiguousimportsonthefly&#xff1a;添加明确的导入 …

CSP-J 2022基础知识答案与解析

1.以下哪种功能没有涉及 C语言的面向对象特性支持&#xff1a;&#xff08; &#xff09;。 (2 分) A.C中调用 printf 函数 B.C中调用用户定义的类成员函数 C.C中构造一个 class 或 struct D.C中构造来源于同一基类的多个派生类 解析&#xff1a;printf是继承自C的&#…

vue2学习 -- 核心语法(二)

文章目录 1. 绑定样式1.1 绑定class1.2 绑定style 2. 渲染2.1 条件渲染2.2 列表渲染key的作用 3. 监视数据3.1 vue监视数据的原理_对象3.2 vue监视数据的原理_数组 4. 收集表单数据5. 过滤器6. 指令6.1 内置指令6.2 自定义指令 7. 生命周期 1. 绑定样式 1.1 绑定class 三种写…

基于LK光流提取算法的图像序列晃动程度计算matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 光流的概念 4.2 基于LK光流算法的图像序列晃动程度计算 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &…

前方高能!2024 MongoDB中国用户大会正式官宣!

前方重磅&#xff01; 2024 MongoDB 中国用户大会 正式官宣&#xff01; 聆听最新产品发布与主题演讲 get行业头部客户案例的精彩分享 与各届优秀同行们现场交流⼼得 与资深MongoDB⼯程师面对面答疑解惑 ⼀起把MongoDB的酷炫周边收⼊囊中&#xff01; …… 欢迎所有Mong…

告别单一渠道,全渠道整合营销让企业营销力MAX!

现阶段&#xff0c;企业纷纷积极寻求新的道路&#xff0c;以拓展国际市场、增强品牌影响力。今天咱们来聊聊全渠道营销那点事儿&#xff0c;特别是对那些想出海闯荡一番的中国企业来说&#xff0c;这可是个必备神器&#xff01;NetFarmer专门企业搞定数字化出海&#xff0c;现在…

室内养猫空气净化器哪个好?真实室内养猫空气净化器使用评价

作为一个养猫多年的猫奴&#xff0c;家里有两只可爱的小猫咪&#xff1a;小白和小花。虽然相处起来很开心&#xff0c;但也给生活带来了一些小麻烦。感受一下40度高温的养猫人&#xff0c;给掉毛怪疏毛浮毛飘飘&#xff0c;逃不过的饮水机&#xff0c;各个角落&#xff0c;多猫…

七夕节高逼格表白方式,送给你的那个TA(可写字版)

别人都有爱心代码了&#xff0c;咱们开发者们也必须有。今天给大家分享个用 Python 写的爱心代码项目&#xff0c;如果感兴趣或者想给自己的另一半制造小浪漫的同学可以自己上手试一试。 运行结果 ** 温馨提示&#xff1a;篇幅有限&#xff0c;源码已打包文件夹&#xff0c;获…