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

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

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

题解参考y总的:http://www.acwing.com

39. 组合总和

我是一看就会,一写就废。先看代码:

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        dfs(candidates,target,0);
        return res;
    }

    void dfs(vector<int>& candidates,int target,int n)
    {
        if(target == 0)
        {
            res.push_back(path);
            return;
        }
        if(n == candidates.size()) return;
        for(int i = 0;candidates[n] * i <= target;i++)
        {
            dfs(candidates,target - candidates[n]*i,n + 1);
            path.push_back(candidates[n]);
        }
        for(int i = 0;candidates[n] * i <= target;i++)
        {
            path.pop_back();
        }

    }
};

这道题目使用模板,关键在两点,一个是递归结束条件,一个是递归过程。首先是递归的结束条件,递归的结束条件就是和前面组合||一样,当target为0的时候,就结束。然后递归的过程,因为这里每个的元素是无限重复选取的,所以使用 i * candidates[n],这里n代表下标为n的元素。

40.组合总和II

看代码:

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;

    vector<vector<int>> combinationSum2(vector<int>& c, int target) {
        sort(c.begin(),c.end());
        dfs(c,target,0);
        return res;
    }

    void dfs(vector<int>& c,int target,int n)
    {
        if(!target)
        {
            res.push_back(path);
            return;
        }
        if(n == c.size()) return;
        int k = n + 1;
        while(k < c.size() && c[k] == c[n]) k++;
        int cnt = k - n;
        for(int i = 0;c[n] * i <= target && i <= cnt;i++)
        {
            dfs(c,target - c[n] * i,k);
            path.push_back(c[n]);
        }
        for(int i = 0;c[n] * i <= target && i <= cnt;i++)
        {
            path.pop_back();
        }
    }
}; 

和第一个一样,只不过这里的元素变成有限个数了,所以首先要统计元素个数,这里借鉴的y的,先从小到大排个序,然后统计一个元素重复的个数,还是使用candidates[n] * i,只要i不超过限制的个数就可以。还可以使用hash表来记录元素的个数。

131.分割回文串

看代码:

class Solution {
public:
    vector<vector<bool>> f;
    vector<vector<string>> res;
    vector<string> path;
    vector<vector<string>> partition(string s) {
        int n = s.size();
        f = vector<vector<bool>>(n,vector<bool>(n));
        for(int j = 0;j < n;j++)
        {
            for(int i = 0;i <= j;i++)
            {
                if(i ==j) f[i][j] = true;
                else if(s[i] == s[j])
                {
                    if(i + 1 > j - 1 || f[i + 1][j - 1]) f[i][j] = true;
                }
            }
        }
        dfs(s,0);
        return res;

    }

    void dfs(string s,int n)
    {
        if(n == s.size()) res.push_back(path);
        else
        {
            for(int i = n;i < s.size();i++)
            {
                if(f[n][i])
                {
                    path.push_back(s.substr(n,i - n + 1));
                    dfs(s,i + 1);
                    path.pop_back();
                }
            }
        }
    }
};

首先要判断一个字串是不是回文,首先第一种方法可以使用双指针的方法,一个从头开始,一个从尾开始,只要每次向中间走都字符都相同,那就是回文。
还有一种方法是:(下图来自acwing截图)
在这里插入图片描述首先判断i到j串,第i位和第j位是相同的字符,然后第i+1和第j-1也是回文,这就用的是递归,第一个方法用的是迭代。
f就是用来记录从第i到j位是否是回文串的。首先先构造f,如果是i==j,也就是单个字母,单个字母肯定的是回文;然后判断s[i]和s[j]是否相等,如果相等,再判断一下,如果是i + 1 > j - 1(也就是就只有两个字母),因为之前已经判断了s[i] == s[j]了,所以就两个字母肯定是回文;或者f[i + 1][j - 1]也是回文,那i到j就是回文。
构建好回文记录表f之后,开始走模板第一步,判断条件,什么时候才算一轮的结果,那必须是所有字母都走过一遍的时候,才是加入一个path的时候,然后然后i从n开始,i每次向后走,每次都判断一下n到i是否是回文,如果是的话就加入答案中。
回到一个地方:有人可能注意到,递归的时候dfs后面是i+1,而不是n+1,我个人认为是如果是n+1的话,因该就已有一条路径了,因为每次递归下去,再回溯到开始的时候,就是最开始的n,它就不变了,最后答案中估计也就一条正确答案,比如aab,可能答案只有:[[“a”,“a”,“b”]]其他没有了,因为回溯到开始n不变了。也就是说如果是n+1,外面的for循环相当于没有作用。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Databend 开源周报第 129 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持标准流 标…

Redis相关面试题大全

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

SD-WAN如何解决网络质量问题?

当选择的线路面临故障、质量下降或拥塞时怎么办&#xff1f;SD-WAN采用智能选路策略&#xff0c;灵活应对各种场景&#xff0c;通过先进的线路切换机制和隧道内流控技术&#xff0c;为用户提供最佳的业务体验。下文将对SD-WAN的线路切换和隧道内流控进行介绍&#xff0c;帮助大…

PySimpleGUI:让spin支持循环

需求 自己用PySimpleGUI写了个小工具&#xff0c;但是发现它的spin不支持循环。 Tkinter本身的Spinbox有wrap这个开关可以觉得是否支持循环&#xff0c;但是没看到PySimpleGUI也支持这个特性。 代码实现 所谓spin的循环&#xff0c;是指当值变换到最大最小值时&#xff0c;可…

Java实现超市账单管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

sell控制脚本案例

1.压缩脚本 写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc-20160613.tar.gz&am…

unity项目《样板间展示》开发:火焰和UI设计

第二章&#xff1a;火焰和UI设计 前言一、火焰模型管理灶台火焰壁炉火焰 二、电视机播放三、UI设计结语 前言 这次带大家从0到1做一个unity项目&#xff1a;《样板间展示》。 顾名思义&#xff0c;项目内容是展示样板间&#xff0c;即玩家可以与房间中的物体、家具进行交互。 至…

网络安全概述---笔记总结

网络安全概述 网络安全---Cyberspace security 2003年美国提出网络空间的概念 --- 一个由信息基础设施组成的互相依赖的网络。我国官方文件定义&#xff1a;网络空间为继海&#xff0c;陆&#xff0c;空&#xff0c;天以外的第五大人类活动领域 发展阶段&#xff1a; 通信保…

如何用html画出一个烟花?

问题描述&#xff1a;如何用html画出一个烟花&#xff1f; 问题解答&#xff1a; 将下面代码复制到一个txt文件中&#xff0c;然后修改后缀txt→html&#xff0c;用浏览器打开就是烟花了。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">…

第4章-IP基本原理

目录 1. IP协议概述 1.1. 定义 1.2. 功能 1.3. IP网络的结构 1.4. IP头格式 2. IP地址和地址映射 3. IP包转发 4. 其他相关协议介绍 1. IP协议概述 1.1. 定义 IP协议&#xff1a;IP协议是网际互连协议&#xff1b; 工作层次&#xff1a;网络层&#xff1b; 封装&#…

esp32-idf eclipse 分区表(partition table / NVS)的读写demo

前言&#xff1a; 分区表&#xff08;Partition Table&#xff09;和 NVS&#xff08;Non-Volatile Storage&#xff09;是 ESP-IDF 中用于存储数据的两种不同机制。 分区表&#xff08;Partition Table&#xff09;&#xff1a; 分区表定义了将 Flash 存储器划分为不同逻辑分…

深度学习|RCNNFast-RCNN

1.RCNN 2014年提出R-CNN网络&#xff0c;该网络不再使用暴力穷举的方法&#xff0c;而是使用候选区域方法&#xff08;region proposal method&#xff09;创建目标检测的区域来完成目标检测的任务&#xff0c;R-CNN是以深度神经网络为基础的目标检测的模型 &#xff0c;以R-C…

机器学习笔记 - 基于自定义数据集 + 3D CNN进行视频分类

一、简述 这里主要介绍了基于自定义动作识别数据集训练用于视频分类的 3D 卷积神经网络 (CNN) 。3D CNN 使用三维滤波器来执行卷积。内核能够在三个方向上滑动,而在 2D CNN 中它可以在二维上滑动。 这里的模型主要基于D. Tran 等人2017年的论文“动作识别的时空卷积研究”。 …

react 实现页面状态缓存(keep-alive)

前言&#xff1a; 因为 react、vue都是单页面应用&#xff0c;路由跳转时&#xff0c;就会销毁上一个页面的组件。但是有些项目不想被销毁&#xff0c;想保存状态。 比如&#xff1a;h5项目跳转其他页面返回时&#xff0c;页面状态不丢失。设想一个 页面我滑倒了中间&#xf…

13个常见的 WordPress 块编辑器问题以及如何修复它们

您在使用 WordPress 块编辑器时遇到过错误吗&#xff1f; WordPress 在 2019 年用名为 Gutenberg 的全新内容编辑器取代了旧的经典编辑器。该编辑器使用块在 WordPress 中创建内容。然而&#xff0c;有时&#xff0c;在使用它时可能会遇到恼人的问题。 在本文中&#xff0c;我…

78.网游逆向分析与插件开发-背包的获取-背包类的C++还原与获取物品名称

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;77.网游逆向分析与插件开发-背包的获取-物品类的C还原-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&…

【论文阅读】Augmented Transformer network for MRI brain tumor segmentation

Zhang M, Liu D, Sun Q, et al. Augmented transformer network for MRI brain tumor segmentation[J]. Journal of King Saud University-Computer and Information Sciences, 2024: 101917. [开源] IF 6.9 SCIE JCI 1.58 Q1 计算机科学2区 【核心思想】 本文提出了一种新型…

R语言rvest爬虫如何设置ip代理?

前言 在R语言中使用rvest进行网络爬虫时&#xff0c;可以使用代理服务器来隐藏真实IP地址。有一些R包可以帮助爬虫中设置代理&#xff0c;其中一个常用的包是httr。以下是一个简单的例子&#xff0c;演示如何在rvest中设置IP代理 教程 一、获取代理IP并提取 二、详情设置 l…

[imx6][Linux4.9]IMX6平台 pinctrl子系统

文章目录 1、Pinctrl 子系统1.1、Pinctrl 子系统的作用1.2、设备树中PIN的配置信息1.2、设备树中PIN的配置信息中的复用信息解析1.3、PINCTRL子系统驱动 主控芯片硬件开发板内核版本imx6100ask_imx6ullLinux-4.9.88 1、Pinctrl 子系统 1.1、Pinctrl 子系统的作用 获取设备树…

Oracle Linux 9.3 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…