当前位置: 首页 > news >正文

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

题目:

链接:剑指 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.lryc.cn/news/103710.html

相关文章:

  • 【前端知识】React 基础巩固(四十三)——Effect Hook
  • 一百三十八、ClickHouse——使用clickhouse-backup备份ClickHouse库表
  • 【无标题】使用Debate Dynamics在知识图谱上进行推理(2020)7.31
  • windows下若依vue项目部署
  • 【目标检测】基于yolov5的水下垃圾检测(附代码和数据集,7684张图片)
  • P1734 最大约数和
  • Excel将单元格中的json本文格式化
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前实时帧率(C#)
  • XGBoost的基础思想与实现
  • 【Docker】Docker的服务更新与发现
  • 【Docker 学习笔记】Docker架构及三要素
  • matlab编程实践14、15
  • C++ ——STL容器【list】模拟实现
  • ubuntu 16.04 安装mujoco mujoco_py gym stable_baselines版本问题
  • 自然语言处理(NLP)技术
  • 如何将ubuntu LTS升级为Pro
  • 如何学习ARM嵌入式开发?
  • 二、使用运行自己的docker python容器环境
  • mac版窗口管理 Magnet for mac中文最新
  • Redis(五)—— Redis进阶部分
  • Go Ethereum源码学习笔记000
  • layui 设置选中时间为当天时间最大值23:59:59、laydate设置选中时间为当天时间最大值23:59:59
  • HTML+CSS+JavaScript:验证码60秒倒计时按钮
  • 互联网医院系统开发:打造便捷高效的医疗服务平台
  • 章节5:SQL注入之WAF绕过
  • iphone卡在恢复模式怎么办?修复办法分享!
  • uniApp禁止遮罩弹窗下的页面滚动
  • 【Huawei】WLAN实验(三层发现)
  • Windows 10 安装 PostgreSQL 12.x 报错 ‘psql‘ 不是内部或外部命令 由于找不到文件libintl-9.dll等问题
  • 在CSDN学Golang云原生(持续交付Argo)