每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题

简介: 每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题

回溯法的理解

本文参考了一位大佬的题解,详细的介绍了回溯法:链接

上一篇刷题文:回溯法经典问题之子集

       记住一句话:for循环横向遍历,递归纵向遍历,回溯不断调整结果集。这句话将从始至终贯穿我们对于以上问题的回溯解决办法。

💮一、字符串的排列

题目链接:剑指 Offer 38. 字符串的排列

题目描述:

       输入一个字符串,打印出该字符串中字符的所有排列。

       你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = "abc"

输出:["abc","acb","bac","bca","cab","cba"]

限制:

1 <= s 的长度 <= 8

本题思路:

       首先:采用经典的“回溯三部曲”:

       1、定义两个全局变量,一个用来存放符合条件单一结果(path),一个用来存放符合条件结果的集合(result)。


       2、回溯的主体,回溯终止条件。path保存一组数据,每次遍历到叶子节点,再插入到result中,并且回溯到上一个节点。


       3、单层搜索的过程。for循环用来横向遍历,递归的过程是纵向遍历。

一句话概括此题就是:

       只有当used[i]==0时才去进行后续操作。

       同一树枝上可以选取,但是同一树层上不可以选取!

       即{i>0&&s[i-1]==s[i]&&used[i-1]==0}才去进行后续操作。

class Solution {
private:
vector<string> result;
void trackback(string& s,string& path,vector<bool>& used)
{
    if(path.size()==s.size())
    {
        result.push_back(path);
        return;
    }
    for(int i=0;i<s.size();i++)
    {
        if(i>0&&s[i]==s[i-1]&&used[i-1]==0)
        continue;
        if (used[i] != 1)
            {
                path.push_back(s[i]);
                used[i] = 1;
                trackback(s,path,used);
                used[i] = 0;
                path.pop_back();
            }
    }
}
public:
    vector<string> permutation(string s) {
        if(s.size()==0)
            return{};
        result.clear();
        vector<bool> used;
        sort(s.begin(),s.end());//关键一步,由于不知道是否重复,所以必须要排序,以找到重复的字母
        string path="";
        used.resize(s.size());
        trackback(s,path,used);
        return result;
    }
};

 特别注意!!!  这里的sort操作是关键的一步!由于不知道是否重复,所以必须要排序,以找到重复的字母,让他们相邻排列。


🌺二、字母大小写全排列

题目链接:784. 字母大小写全排列

题目描述:

       给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

示例 1:

输入:s = "a1b2"

输出:["a1b2", "a1B2", "A1b2", "A1B2"]


示例 2:

输入: s = "3z4"

输出: ["3z4","3Z4"]

提示:

  • 1 <= s.length <= 12
  • s 由小写英文字母、大写英文字母和数字组成

本题思路:

       同样的,采用回溯三部曲,但是我们这次不采用for循环遍历,因为根据题意,本题仅仅只是改变“字母的大小写转化”。如下:

       1、定义两个全局变量,一个用来存放符合条件单一结果(path),一个用来存放符合条件结果的集合(result)。注意要记得用一个变量来记录遍历的位置。


       2、回溯的主体,回溯终止条件。path保存一组数据,每次遍历到叶子节点,再插入到result中,并且回溯到上一个节点。


       3、无需for循环横向遍历,仅仅纵向遍历,即递归的过程。

 梳理一下判断的条件:判断是否为字母,如果是字母,则不管他是否为大小写,直接转化为小写插入path,进行递归,递归回来后再转化为大写插入path,递归。如果不是字母,则直接插入parh,进行下一层的递归。

       一图让你了解~(以a1b2为例)

class Solution {
private:
vector<string> result;
void backtrack(string& s,string& path,int index)
{
    if(s.size()==path.size())
    {
        result.push_back(path);
        return;
    }
    if(isalpha(s[index]))
    {
        path.push_back(tolower(s[index]));
        backtrack(s,path,index+1);
        path.pop_back();
        path.push_back(toupper(s[index]));
        backtrack(s,path,index+1);
        path.pop_back();
    }else
    {
        path.push_back(s[index]);
        backtrack(s,path,index+1);
        path.pop_back();
    }
}
public:
    vector<string> letterCasePermutation(string s) {
        result.clear();
        string path="";
        backtrack(s,path,0);
        return result;
    }
};



        感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

相关文章
|
11月前
|
机器学习/深度学习 自动驾驶 算法
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
在智慧交通和智能驾驶日益普及的今天,准确识别复杂交通场景中的关键元素已成为自动驾驶系统的核心能力之一。传统的图像处理技术难以适应高动态、复杂天气、多目标密集的交通环境,而基于深度学习的目标检测算法,尤其是YOLO(You Only Look Once)系列,因其检测速度快、精度高、可部署性强等特点,在交通场景识别中占据了重要地位。
1236 0
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
|
传感器 数据采集 机器学习/深度学习
人工智能与环境保护:智能监测与治理的新策略
【9月更文挑战第21天】人工智能在环境保护中的应用,为智能监测与治理提供了新的策略和方法。通过实时数据采集与分析、智能预警与应急响应、精准化决策支持等技术的应用,AI正在引领一场革命性的变革。未来,随着技术的不断发展和应用场景的拓展,AI将在环境保护中发挥更加重要的作用,助力我们构建更加绿色、可持续的未来。让我们携手共进,共同迎接一个更加美好的明天。
|
存储 固态存储 NoSQL
阿里云服务器ESSD AutoPL、高效云盘、ESSD云盘、SSD云盘区别与选型参考
阿里云系统盘与数据盘如何选择?目前阿里云服务器的云盘主要有ESSD AutoPL、高效云盘、ESSD云盘、SSD云盘可供选择,很多新手用户并不清楚他们之间的区别,也就不知道应该如何选择,因为不同的云盘在最大IOPS、最大吞吐量等性能上是有区别的。本文基于阿里云官方技术文档,结合实际应用案例,对ESSD AutoPL、ESSD PL-X、SSD云盘等主要云盘的区别做个介绍,以供参考,助您构建高性能、高可靠、高扩展的存储架构。
|
机器学习/深度学习 存储 自然语言处理
深度学习之少样本学习
少样本学习(Few-Shot Learning, FSL)是深度学习中的一个重要研究领域,其目标是在只有少量标注样本的情况下,训练出能够很好地泛化到新类别或新任务的模型。
823 2
|
机器学习/深度学习 算法 PyTorch
全面掌握胶囊网络:从基础理论到PyTorch实战
全面掌握胶囊网络:从基础理论到PyTorch实战
809 0
|
运维 Kubernetes Docker
微服务的成本效益分析
【8月更文第29天】随着微服务架构的流行,越来越多的企业开始考虑采用这一架构模式来构建他们的应用程序和服务。然而,迁移到微服务并非没有代价。本文旨在评估采用微服务架构所带来的成本增加与收益,并探讨如何优化资源使用,以最大化成本效益比。
1196 1
|
存储 JavaScript 安全
Web安全之XSS跨站脚本攻击
XSS(跨站脚本攻击)
531 7
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
1192 0
|
开发工具 git
Gitlab上手指南(八)|企业中常见的git规范介绍和husky+commitlint集成
俗话说,没有规矩不成方圆,我们的git也需要规范。 下面介绍一下企业常用的一些规范。 分支管理规范 分支命名不能千奇百怪,必须有统一的命名方式。主要有以下几种: 分支管理 命名规范 解释 master
1905 0
|
存储 资源调度 关系型数据库
Docker官方文档学习笔记(二):Docker Desktop入门
Docker官方文档学习笔记(二):Docker Desktop入门
4543 0
Docker官方文档学习笔记(二):Docker Desktop入门