草庐IT

【LeetCode】剑指 Offer(20)

戊子仲秋 2023-04-05 原文

目录

题目:剑指 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;
            }
        }
    }
};

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

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

过啦!!!

写在最后:

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

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

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

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

有关【LeetCode】剑指 Offer(20)的更多相关文章

  1. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  2. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  3. IDEA使用LeetCode插件 - 2

    前言我们习惯用idea编写、调试代码,在LeetCode上刷题时,如果能够在IDEA编写代码,并且做好代码管理,是一件事半功倍的事情。对于后续复习题目,做笔记也会非常便利。本文目的在于介绍LeetCodeEditor的使用,以及配置工具类,最终目录结构如下:note:放置笔记src:放置代码leetcode.editor.cn:插件LeetCodeEditor自动生成utils:自定义的工具包,可用于自动化输入测试用例,定义题目需要的类(结构体)out:运行测试时自动生成LeetCodeEditorGitHub:https://github.com/shuzijun/leetcode-edit

  4. Ubuntu20.04系统WineHQ7.0安装微信 - 2

    提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信--可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe报错。2.原生微信安装:linux系统下的微信安装(ubuntu20.04)--微信适配的最好,反应最快,但是微信版本只到2.1.1,版本太老,很多功能都没有。3.深度deepin-wine6安装微信:ubuntu20.04+系统deepin-wine6安装新版微信--综合比较好,当前个人使用此种方法1个月,微信版本3.4;没什么大问题,尚可。一、WineHQ7.0安装微信

  5. ruby-on-rails - encode_www_form 将空格转换为 + 而不是 %20 - 2

    我正在尝试从使用RubyonRails的散列创建http参数,我尝试使用URI.encode_www_form(params),但这没有正确生成参数。下面是我的哈希值params['Name'.to_sym]='NiaKun'params['AddressLine1'.to_sym]='AddressOne'params['City'.to_sym]='CityName'这个方法把空格转成+,我要的是把空格转成%20我收到"Name=Nia+Kun&AddressLine1=Address+One&City=City+Name"但我需要将此空格转换为%20

  6. ruby - 如何在 Node.js/RoR 中监控 20 个网站(Ping 或 HTTP)的正常运行时间 - 2

    每5分钟(例如)ping20个网站的列表以了解该网站是否响应HTTP202的最佳方法是什么?最简单的想法是将20个URLS保存在数据库中,然后运行数据库并对每个URL执行ping操作。但是,当一个人不回答时会发生什么?之后的人会怎样?此外,是否有更好但更简单的解决方案?恐怕该列表会增长到20000个网站,然后没有足够的时间在我需要ping的5分钟内全部ping通它们。基本上,我是在描述PingDom、UptimeRobot等的工作原理。我正在使用node.js和RubyonRails构建这个系统。我也倾向于使用MongoDB来保存所有ping和监控结果的历史记录。建议?非常感谢!

  7. ruby-on-rails - 如何在 Rails 中使用空格作为 '%20' 而不是 '+' 获取 url 的参数 - 2

    如果我有这个参数用于添加到URLparams={name:'JohnKey'}并使用方法to_param:params.to_param=>"name=John+Key"重点是'+'没有被所使用的服务正确读取,需要'%20'而不是name=John%20Key:Whentoencodespacetoplus(+)or%20?有没有办法在不使用gsub的情况下返回带有“%20”的参数? 最佳答案 我会建议只坚持使用gsub,也许用注释来解释这种行为的必要性。虽然您可以通过使用URI.escape解决问题,但据说它已被弃用,因为它不完全

  8. 【算法题解】20. 两数之和 - 2

    这是一道简单题题目来自:https://leetcode.cn/problems/two-sum/题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。提示:22nums.length104−109−109nums[i]109−109−109target109只会存在一个有效答案进阶:你可以想出一个时间复杂度小于O(n2)O(n^2)O(n2)的算法吗?示例1:输入:nums=[2,7,11,15],targe

  9. 【哈士奇赠书活动 - 20期】-〖从程序员到架构师〗 - 2

    文章目录⭐️赠书活动-《从程序员到架构师》⭐️编辑推荐⭐️作者简介⭐️赠书活动→获奖名单⭐️赠书活动-《从程序员到架构师》内容简介:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》分为数据持久化层场景实战、缓存层场景实战、基于常见组件的微服务场景实战、微服务进阶场景实战和开发运维场景实战5个部分。基于对十余个架构搭建与改造项目的经验总结,介绍了大数据量、缓存、高并发、微服务、多团队协同等核心场景下的架构设计常见问题及其通用技术方案,包含冷热分离、查询分离、分表分库、秒杀架构、注册发现、熔断、限流、微服务等具体需求下的技术选型、技术原理、技术应用、技术要点等内容,将

  10. (问题解决)(自制脚本)Ubuntu20.04 键盘会突然失灵、键盘延迟突然很大怎么办 - 2

    问题描述:最近在写毕业论文,代码在ubuntu上跑的,得一边跑代码,一边写论文。但用一段时间,或者电脑静置一段时间后,键盘输入延迟突然变得很大,这期间鼠标是正常的,只是输不了字,得等几分钟才能恢复正常,非常耽误时间。解决方法后来参考下面这篇博客,说是ibus拼音输入法的问题,重启一下就行。ubuntuibus输入法突然无法输入(延迟过高)解决方法_q779的博客-CSDN博客_ubuntu键盘无法输入重启方法:终端输入"ibusrestart",键盘又可以正常使用了。ibusrestart自制脚本方法但是问题又来了,键盘有问题,输入延迟大,这样就没法在终端输入重启命令。因此我写了个脚本方式,每

随机推荐