【C++】牛客——JZ38 字符串的排列

✨题目链接:

JZ38 字符串的排列


✨题目描述 

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

 数据范围:𝑛<10
要求:空间复杂度 𝑂(𝑛!),时间复杂度 𝑂(𝑛!)

✨输入描述:

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

✨示例1

📍输入

 "ab"

📍返回值:

["ab","ba"]

📍说明

返回["ba","ab"]也是正确的  

✨示例2

📍输入

"aab"

📍返回值:

["aab","aba","baa"]

✨示例3

📍输入

"abc"

📍返回值:

["abc","acb","bac","bca","cab","cba"]

✨示例4

📍输入

""

📍返回值:

[""]


✨解题思路

 这道题目的解法看图片已经给我们提示一大半了

  • 使用递归,每一层固定pos位置
  • 每次swap pos位置和i位置
  • 把swap后的str插入vector中
  • 进入下层递归

因为此时我们vector中存的是所有可能的情况包括重复情况,所以我们要想办法去重操作

有两种去重的方法

  1. set 去重:set  可以自动去重来存储vector中的唯一元素,然后再将set中的元素复制回vector
  2. sort + unique 去重:你可以首先对vector进行排序,然后使用unique来删除连续的重复元素。但请注意,unique只是将重复元素移到容器末尾并返回一个迭代器指向非重复区域的末尾,你需要通过调整vector的大小来真正删除这些元素。

 两种方法的区别:不关心元素的顺序,那么使用set可能更简单。如果希望保留原始顺序,并且不介意在内部对元素进行排序,那么第二种方法可能更合适。


✨代码
 

#include <fstream>
#include <string>
#include <vector>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;class Solution {
public:/*两种去重操作*/void removeDuplicates1(vector<string>& vec) {set<string> s(vec.begin(), vec.end());vec.clear(); // 清空原vectorvec.insert(vec.begin(),s.begin(), s.end()); // 插入去重后的元素}void removeDuplicates2(vector<string>& vec) {sort(vec.begin(), vec.end()); // 排序  vec.erase(unique(vec.begin(), vec.end()), vec.end()); // 去重  }void strsub(string str, vector<string>& vs, int pos) {for (int i = pos; i < str.size(); i++) {swap(str[pos], str[i]);vs.push_back(str);strsub(str, vs, pos + 1);}}vector<string> Permutation(string str) {vector<string> vs;vs.push_back(str);strsub(str, vs, 0);removeDuplicates1(vs);return vs;}
};


※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持

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

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

相关文章

Pi 母公司将开发情感 AI 商业机器人;Meta 科学家:Sora 不是视频生成唯一方向丨RTE 开发者日报 Vol.214

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

揭秘IDM:数字资产管理的未来之星

在当今数字化时代&#xff0c;数字资产管理的重要性日益凸显。随着科技的飞速发展&#xff0c;越来越多的企业和个人开始关注如何有效管理和保护他们的数字资产。在这个过程中&#xff0c;IDM&#xff08;身份管理系统&#xff09;逐渐成为了热门话题。IDM作为一种新兴的技术手…

圆通(有原则,会变通) VS 圆滑

圆通不是圆滑&#xff0c;圆通是随机应变&#xff0c;圆滑则是投机取巧&#xff0c;两者差别很大。圆通更趋向于褒义。圆滑的意思是不负责任&#xff0c;擅长推卸&#xff0c;不得罪人&#xff0c;圆通的意思是坚持自己的原则&#xff0c;但是不会使用粗暴的方式来解决&#xf…

动手学操作系统(四、MBR读取硬盘加载Loader)

动手学操作系统&#xff08;四、MBR读取硬盘加载Loader&#xff09; 在上一节中&#xff0c;我们学习了使用MBR来直接控制显卡进行显示&#xff0c;在这一节中我们学习如何让MBR来操作硬盘&#xff0c;加载Loader来完成操作系统的后续启动过程。 文章目录 动手学操作系统&…

神经网络与深度学习——第14章 深度强化学习

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第14章 深度强化学习 深度强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;&#xff0c;也叫增强学习&#xff0c;是指一类从与环境交互中不断学习的问题以及解决这类问题…

JavaScript引用外部js文件

我们可以把脚本保存到外部文件中。外部文件通常包含被多个网页使用的代码。外部 JavaScript 文件的文件扩展名是 .js。如需使用外部文件&#xff0c;请在 <script> 标签的 "src" 属性中设置该 .js 文件&#xff1a; 如&#xff1a; <!DOCTYPE html> &l…

SQL刷题笔记day4补

1题目 我的正确代码 select e.last_name,e.first_name,d.dept_name from employees e left join (select departments.dept_name,dept_emp.emp_no,dept_emp.dept_no from departments join dept_emp on departments.dept_nodept_emp.dept_no) d on e.emp_nod.emp_no复盘&…

(文章复现)分布式电源接入配电网承载力评估方法研究

参考文献&#xff1a; [1]郝文斌,孟志高,张勇,等.新型电力系统下多分布式电源接入配电网承载力评估方法研究[J].电力系统保护与控制,2023,51(14):23-33. 1.摘要 随着光伏和风电等多种分布式电源的接入&#xff0c;使得传统配电网的结构及其运行状态发生了较大改变。因此&…

机器学习-8-超参数寻优的常用算法

参考参数优化系列1–随机搜索算法原理及其代码实现 参考参数优化系列2–网格搜索 参考参数优化系列3–贝叶斯算法 参考参数优化系列4–强化学习算法 参数优化系列5–粒子群算法 参考贝叶斯超参数寻优scikit-optimize 参考全面总结机器学习超参数调优 1 随机搜索算法 随机搜索…

【网络】网络编程套接字

一、知识提及 1.源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址 2.端口号 端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数;端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;IP地址 …

一文介绍数据和模型漂移(Drift):漂移检测示例

大家好&#xff0c;漂移(Drift)是机器学习中用来描述模型在生产环境中随着时间推移而性能逐步下降的现象&#xff0c;由很多原因引起&#xff0c;主要原因是随着时间推移输入数据&#xff08;x&#xff09;分布的变化和期望目标&#xff08;y&#xff09;之间的关系发生了变化。…

PHP MySQL图解学习指南:开启Web开发新篇章

PHP曾经是最流行的Web开发语言&#xff0c;许多世界领先的网站(如Facebook、维基百科和WordPress)都是用它编写的。PHP运行在Web服务器端&#xff0c;通过使用存储在MySQL数据库中的数据&#xff0c;使得网站可以为每一位访问者显示不同的定制页面。书中采用简单、直观的图示化…

STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中的元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;所有需要用到堆的位置&#xff0c;都可以考虑使用priority_queue。 注意&#xff1…

可选链与空值合并运算符的妙用

可选链&#xff08;Optional Chaining&#xff09;和空值合并运算符&#xff08;Nullish Coalescing Operator&#xff09;是 JavaScript 中的两个新特性&#xff0c;它们可以在处理可能为 null 或 undefined 的值时提供更简洁和安全的代码。 可选链允许我们通过在对象的属性后…

【好书分享第十三期】AI数据处理实战108招:ChatGPT+Excel+VBA

文章目录 一、内容介绍二、内页插图三、作者简介四、前言/序言五、目录 一、内容介绍 《AI数据处理实战108招&#xff1a;ChatGPTExcelVBA》通过7个专题内容、108个实用技巧&#xff0c;讲解了如何运用ChatGPT结合办公软件Excel和VBA代码实现AI办公智能化、高效化。随书附赠了…

NDIS驱动开发-NET_BUFFER体系

网络数据由通过网络发送或接收的数据包组成。 NDIS 提供数据结构来描述和组织此类数据。 NDIS 6.0 及更高版本的主要网络数据结构包括&#xff1a; NET_BUFFERNET_BUFFER LISTNET_BUFFER_LIST_CONTEXT 它们之间的关系如下: 在 NDIS 6.0 及更高版本中&#xff0c; NET_BUFFER …

AI工程师:高薪时代的领跑者

在科技飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术正日益成为推动社会进步的关键力量。与此同时&#xff0c;AI领域的人才需求也呈现出井喷之势&#xff0c;其中AI工程师更是成为了各大企业竞相争夺的“香饽饽”。根据最新数据显示&#xff0c;AI工程师…

串口调试助手中文乱码 解决方案

输出乱码 一般&#xff0c;当串口调试助手输出乱码时&#xff0c;可能有以下几个原因&#xff1a; 波特率设置错误&#xff1a;串口通信需要保证发送和接收的设备使用相同的波特率。请检查串口调试助手和目标设备的波特率设置是否一致。 数据位、停止位或校验位设置错误&…

支持向量机、随机森林、K最近邻和逻辑回归-九五小庞

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;、随机森林&#xff08;Random Forest&#xff09;、K最近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;和逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习和统计学习中常用的分类算法。…

【目标解算】相机内外参数详细解读+坐标系转换

一、相机参数介绍 1.1 相机内参矩阵 概念&#xff1a;内参矩阵用于描述相机的内部参数&#xff0c;它包含了相机的焦距、主点坐标和图像的畸变等信息。内参矩阵的形式通常为一个3x3的矩阵&#xff0c;常用表示为K。内参矩阵可以将相机坐标系中的三维点映射到图像平面上的二维…