剑指 Offer 38. 字符串的排列 / LeetCode 47. 全排列 II(回溯法)

news/2025/1/15 17:25:31/

题目:

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

难度:中等

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

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

示例:

输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

限制:

  • 1 <= s 的长度 <= 8

回溯法:

本题与LeetCode 47. 全排列 II基本相同,详细解析看这篇回溯算法秒杀所有排列/组合/子集问题,这类题型通杀。

代码(剑指 Offer 38. 字符串的排列):

class Solution {
public:vector<string> res;string track;  // 全局遍历路径vector<bool> used;  // 遍历过程中字符串s每个字符是否在路径中已使用vector<string> permutation(string s) {used = vector<bool>(s.size(), false);sort(s.begin(), s.end());  // 先排序,是为了让重复字符相邻backTrack(s);return res;}void backTrack(string& s) {if(track.size() == s.size()) {  // 一个完整的排列结果加入答案中res.emplace_back(track);return;}for(int i = 0; i < s.size(); i++){if(used[i]) continue;  // 已经在路径中的字符不再参与if(i > 0 && s[i] == s[i - 1] && !used[i - 1]) continue;  // 剪枝,固定重复的字符在排列中的相对位置track += s[i];used[i] = true;backTrack(s);  // 进入下一层决策树track.pop_back();  // 回溯used[i] = false;}}
};

代码(LeetCode 47. 全排列 II):

class Solution {
public:vector<vector<int>> res;vector<int> track;vector<bool> used;vector<vector<int>> permuteUnique(vector<int>& nums) {used.resize(nums.size(), false);sort(nums.begin(), nums.end());backTrack(nums);return res;}void backTrack(vector<int>& nums) {if(track.size() == nums.size()) {res.emplace_back(track);return;}for(int i = 0; i < nums.size(); i++){if(used[i]) continue;if(i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;track.emplace_back(nums[i]);used[i] = true;backTrack(nums);track.pop_back();used[i] = false;}}
};

时间复杂度O(N * N!)。全部的排列有O(N!)个,每个排列平均需要O(N)的时间。
空间复杂度O(N)。


http://www.ppmy.cn/news/994717.html

相关文章

【Linux】yum工具的认识及使用

【Linux】yum工具的认识及使用 1.知识点补充2.yum是什么3.yum常用指令3.1查看软件安装包3.1.1关于rzsz 3.2安装软件3.3卸载软件 4.yum扩展4.1扩展14.2扩展24.3扩展3 什么是工具&#xff1f; 本质上也是指令 1.知识点补充 1.我们一般安装软件&#xff0c;是不是需要把软件安装…

Linux6.21 ansible playbook 剧本

文章目录 计算机系统5G云计算第一章 LINUX ansible playbook 剧本一、概述二、playbook应用1.示例2.运行playbook3.定义、引用变量4.指定远程主机sudo切换用户5.when条件判断6.迭代7.Templates 模块8.tags 模块 计算机系统 5G云计算 第一章 LINUX ansible playbook 剧本 一、…

实用调试技巧(1)

什么是bug&#xff1f;调试是什么&#xff1f;有多重要&#xff1f;debug和release的介绍。windows环境调试介绍。一些调试的实例。如何写出好&#xff08;易于调试&#xff09;的代码。编程常见的错误。 什么是Bug 我们在写代码的时候遇到的一些问题而导致程序出问题的就是Bu…

子数组的解释与专题

子数组&#xff1a;指在一个数组中&#xff0c;选择一些连续的元素组成的新数组。 例题一&#xff1a;6900. 统计完全子数组的数目 给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&#xff0c;则称之为 完全子数组 &#xff1a; 子数组中 不同 …

【多模态】22、UniDetector | 检测开放世界中的一切!(CVPR2023)

文章目录 一、背景二、方法2.1 UniDetector 框架结构2.2 Heterogeneous Label Space Training2.3 open-world inference 三、效果3.1 数据集3.2 Object Detection in the Open World3.3 Object Detection in the Closed World3.4 Object Detection in the Wild3.5 Comparison w…

基于高通QCC5171的对讲机音频数据传输系统设计

一 研发资料准备 二 设计方法 蓝牙连接与配对&#xff1a;使用QCC5171的蓝牙功能&#xff0c;实现设备之间的蓝牙连接和配对。确保设备能够相互识别并建立起稳定的蓝牙连接。 音频采集与处理&#xff1a;将麦克风采集到的音频数据通过QCC5171的ADC&#xff08;模数转换器&…

SQL项目实战:银行客户分析

大家好&#xff0c;本文将与大家分享一个SQL项目&#xff0c;即根据从数据集收集到的信息分析银行客户流失的可能性。这些洞察来自个人信息&#xff0c;如年龄、性别、收入和人口统计信息、银行卡类型、产品、客户信用评分以及客户在银行的服务时间长短等。对于银行而言&#x…

7月31日,每日信息差

1、东京电视台将在中国推广内容IP“刀姬” 2、沙特是中国在中东地区首个千亿美元级贸易伙伴 3、国家发改委&#xff1a;促消费政策不是所谓的“掏空钱包”“透支需求”。让居民开心花钱、买到心仪的商品和服务&#xff0c;本身就是利民生的好事 4、英国电信集团任命艾莉森柯…