算法进阶——字符串的排列

news2024/10/7 6:45:11

题目


输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

数据范围:n<10

要求:空间复杂度 O(n!),时间复杂度 O(n!)

输入描述:输入一个字符串,长度不超过10,字符只包括大小写字母。

示例1

输入:
"ab"
返回值:
["ab","ba"]
说明:
返回["ba","ab"]也是正确的

示例2

输入:
"aab"
返回值:
["aab","aba","baa"]

示例3

输入:
"abc"
返回值:
["abc","acb","bac","bca","cab","cba"]

示例4

输入:
""
返回值:
[""]

思路


使用递归的思路,每次先交换一个字符(可以是自己),然后将这个字符固定,之后递归的将后面的字符进行一次全排列,最后记得每次递归完需要回溯,也就是将交换的字符还原。

另外原字符串中可能存在重复的字符,如“aab”,经过递归后会有重复的,所以可以使用set来保存结果,以达到去重的效果。

递归三件套:

  • 递归函数的功能:Permutation(int pos, string str), 表示固定字符串str的pos下标的字符str[pos]
  • 递归终止条件:当pos+1 == str.length()的时候,终止。完成了一次全排列。
  • 下一次递归:Permutation(pos+1, str), 很显然,下一次递归就是对字符串的下一个下标进行固定。

解答代码


#include <any>
#include <set>
#include <type_traits>
class Solution {
public:
    /**
     * @param str string字符串 
     * @return string字符串vector
     */
    vector<string> Permutation(string str) {
        // write code here
        vector<string> ret{""};
        if (str.empty()) {
           return ret; 
        }

        //用set去重
        set<string> no_repeat_ret;
        Permutation(0, str, no_repeat_ret);
        ret.assign(no_repeat_ret.begin(), no_repeat_ret.end());
        return ret;
    }

    void Permutation(int pos, string str, set<string>& no_repeat_ret) {
        if (pos+1 == str.length()) {
            // 递归终止条件:完成一次全排列
            no_repeat_ret.emplace(str);
            return;
        }

        for (int i = pos; i < str.length(); i++) {
            // 交换字符,固定一个字符
            swap(str[pos], str[i]);
            // 递归调用,对字符串的下一个下标进行固定
            Permutation(pos+1, str, no_repeat_ret);
            // 递归完需要回溯
            swap(str[pos], str[i]);
        }
    }
};

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

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

相关文章

pillow篇---pillow连续打开同一张图片会导致打开失败问题

如果你需要在多次操作同一张图像时避免出现缓存问题&#xff0c;你可以使用 Image.open() 方法的 seek() 方法将文件指针移动到图像数据的开头&#xff0c;以便重新读取图像数据。示例如下&#xff1a; from PIL import Image# 打开图像文件 image Image.open(example.jpg)# …

C# OpenVINO 通用OCR识别 文字识别 中文识别 服务

软件说明 基于以下开源项目&#xff0c;做了再次封装 https://github.com/sdcb/OpenVINO.NET 自带模型&#xff0c;可离线部署&#xff1b; 技术路线&#xff1a;VS2022Sdcb.OpenVINOSdcb.OpenVINO.PaddleOCROpenCvSharpNLogNancy.Hosting.Self 软件界面 开启服务 测试 耗时…

Lumen/Laravel - 数据库读写分离原理 - 探究

1.应用场景 主要用于学习与探究Lumen/Laravel的数据库读写分离原理。 2.学习/操作 1.文档阅读 chatgpt & 其他资料 数据库入门 | 数据库操作 | Laravel 8 中文文档 入门篇&#xff08;一&#xff09;&#xff1a;数据库连接配置和读写分离 | 数据库与 Eloquent 模型 | La…

K8S云计算系列-(4)

K8s Dashboard UI 部署实操 Kubernetes实现的最重要的工作是对Docker容器集群统一的管理和调度&#xff0c;通常使用命令行来操作Kubernetes集群及各个节点&#xff0c;命令行操作非常不方便&#xff0c;如果使用UI界面来可视化操作&#xff0c;会更加方便的管理和维护。如下为…

数学建模——平稳时间序列分析方法

目录 1、平稳性的Daniel检验 &#xff08;1&#xff09;Spearman相关系数假设检验 &#xff08;2&#xff09;时间序列平稳性的Danniel假设检验 案例 【模型分析】 1、原始数据at的平稳性检验 2、一阶差分序列的平稳性检验 3、二阶差分序列的平稳性检验 4、建立AR&#…

智能机场系统:打造出行体验的未来

随着航空业的迅猛发展&#xff0c;机场作为出行的重要枢纽&#xff0c;必须不断提升自身的服务质量和效率。智能机场系统应运而生&#xff0c;为旅客提供更加便捷、智能化的出行体验。本文将从技术应用、服务优化和安全保障三个方面&#xff0c;全面介绍智能机场系统的特点和优…

YOLOv8 究竟超越 YOLOv5 了吗?

在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;一直是一种突破性算法。自YOLO算法问世以来&#xff0c;它已经演变为许多版本&#xff0c;其中最受欢迎的版本是YOLOv5和YOLOv8。这两个版本都有独特的特点和优势&#xff0c;使它们在各自的领域表现…

【23-24 秋学期】NNDL 作业3

过程推导 - 了解BP原理数值计算 - 手动计算&#xff0c;掌握细节代码实现 - numpy手推 pytorch自动 对比【numpy】和【pytorch】程序&#xff0c;总结并陈述。激活函数Sigmoid用PyTorch自带函数torch.sigmoid()&#xff0c;观察、总结并陈述。激活函数Sigmoid改变为Relu&#…

Spring编程常见错误50例-Spring AOP常见错误(上)

Spring AOP常见错误&#xff08;上&#xff09; this调用的当前类方法无法被拦截 问题 假设当前开发负责电费充值的类&#xff0c;同时记录下进行充值的时间(此时需要使用到AOP)&#xff0c;并提供电费充值接口&#xff1a; Service public class ElectricService {public …

【CANN训练营】Ascend算子开发入门笔记

基础概念 什么是Ascend C Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C标准规范&#xff0c;最大化匹配用户开发习惯&#xff1b;通过多层接口抽象、自动并行计算、孪生调试等关键技术&#xff0c;极大提高算子开发效率&#xff0c;助力AI开发者低成本完成算子…

膝关节检测之1设计目标手势与物体交互的动画

原来只用unity自带的IK&#xff0c;发现背部不能动&#xff0c;且手和手指的移动和旋转试了好像没法通过animation实现&#xff08;加入关键帧并修改最终状态的数值后播放没有变化&#xff0c;确定最终关键帧的数值已经改了的&#xff09;。看资料&#xff0c;发现final IK&…

如何使用前端构建工具(如Webpack、Parcel)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

C++安装qt软件教程

目录 一、工具 二、安装步骤 1.1next 1.2安装目录 1.3安装环境设置选项 1.4Qt5.14.2 --> MinGW 7.3.0 64-bit 1.5 Qt5.14.2 --> 3D以下全选 1.6下一步 1.7下一步 1.8安装 三、什么是 Qt Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提…

软件工程与计算总结(七)需求文档化与验证

目录 一.文档化的原因 二.需求文档基础 1.需求文档的交流对象 2.用例文档 3.软件需求规格说明文档 三.需求文档化要点 1.技术文档协作要点 2.需求书写要点 3.软件需求规格说明文档属性要点 四.评审软件需求规格说明文档 1.需求验证与确认 2.评审需求的注意事项 五…

北京消防展隆重举行,汉威科技消防安全创新方案引关注

10月10日&#xff0c;第二十届中国国际消防设备技术交流展览会在北京市顺义区中国国际展览中心新馆隆重举行。 据悉&#xff0c;该展会由中国消防协会举办&#xff0c;是世界三大消防品牌展会之一&#xff0c;吸引了40多个国家和地区的1000余家单位参展&#xff0c;参展产品超万…

面试官:谈谈 Go 内存分配策略

大家好&#xff0c;我是木川 Go语言内置运行时&#xff08;就是runtime&#xff09;&#xff0c;抛弃了传统的内存分配方式&#xff0c;改为自主管理。这样可以自主地实现更好的内存使用模式&#xff0c;比如内存池、预分配等等。这样&#xff0c;不会每次内存分配都需要进行系…

找不到x3daudio1_7.dll怎么解决?x3daudio1_7.dll的5个修复方法

电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到各种问题&#xff0c;其中之一就是“找不到x3daudio1_7.dll&#xff0c;无法运行启动软件或者游戏”。这个问题可能会影响到我们的正常使用&#xff0c;甚至可能导…

2023 年 Arm A-Profile 架构发展

随着人工智能 (AI) 的兴起和安全威胁的加剧,计算需求不断发展,作为世界设备核心的基础计算架构也必须不断发展。这就是为什么我们的工程团队向普遍存在的 Arm 架构添加新功能和技术,然后软件团队确保软件尽可能无缝地适应这些未来的功能和技术。 Arm架构是如何开发的 Arm …

一种高速1553B总线通信接口模块

一种高速1553B总线通信接口模块 引言 -- 在现代航空电子系统中&#xff0c;总线通信技术已成为不可或缺的一部分1553B总线作为军用标准总线&#xff0c;被广泛应用于各种军事和航天领域。本文主要介绍了一种高速1553B总线通信接口模块的设计与实现方法。该模块不仅具有高可…

Unity基础课程之物理引擎5-射线的使用方法总结

在实际游戏开发时&#xff0c;不可避免地要用到各种射线检测。即便是一个不怎么用到物理系统的游戏&#xff0c;也很可能要用到射线检测机制。换句话说&#xff0c;射线检测在现代游戏开发中应用得非常广泛&#xff0c;超越了物理游戏的范围。下面简单举几个例子。 &#xff0…