剑指 Offer(第2版)面试题 38:字符串的排列

剑指 Offer(第2版)面试题 38:字符串的排列

  • 剑指 Offer(第2版)面试题 38:字符串的排列
    • 解法1:回溯
    • 扩展题一:LeetCode 46. 全排列
    • 扩展题二:LeetCode 47. 全排列 II

剑指 Offer(第2版)面试题 38:字符串的排列

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

解法1:回溯

全排列问题,且各个字符都不相同。

代码:

void Permutation(char *pStr)
{if (pStr == nullptr)return;Permutation(pStr, pStr);
}void Permutation(char *pStr, char *pBegin)
{if (*pBegin == '\0')printf("%s\n", pStr);for (char *pCh = pBegin; *pCh != '\0'; pCh++){swap(*pCh, *pBegin);Permutation(pStr, pBegin + 1);swap(*pCh, *pBegin);}
}

复杂度分析:

时间复杂度:O(n × n!),其中 n 是序列的长度。回溯的调用次数是 O(n!),对于每个回溯的叶子节点,我们需要将当前答案使用 O(n) 的时间复制到答案数组中,相乘得时间复杂度为 O(n × n!)。

空间复杂度:O(n),其中 n 是序列的长度。除答案数组以外,递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,这里可知递归调用深度为 O(n)。

扩展题一:LeetCode 46. 全排列

题目来源:LeetCode 46. 全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

代码:

/** @lc app=leetcode.cn id=46 lang=cpp** [46] 全排列*/// @lc code=start
class Solution
{
public:// 主函数vector<vector<int>> permute(vector<int> &nums){vector<vector<int>> ans;backtrack(nums, 0, ans);return ans;}// 辅函数void backtrack(vector<int> &nums, int level, vector<vector<int>> &ans){if (level == nums.size() - 1){ans.push_back(nums);return;}for (int i = level; i < nums.size(); i++){swap(nums[i], nums[level]);      // 修改当前节点状态backtrack(nums, level + 1, ans); // 递归子节点swap(nums[i], nums[level]);      // 回改当前节点状态}}
};
// @lc code=end

复杂度分析:

时间复杂度:O(n × n!),其中 n 是数组 nums 的长度。回溯的调用次数是 O(n!),对于每个回溯的叶子节点,我们需要将当前答案使用 O(n) 的时间复制到答案数组中,相乘得时间复杂度为 O(n × n!)。

空间复杂度:O(n),其中 n 是数组 nums 的长度。除答案数组以外,递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,这里可知递归调用深度为 O(n)。

扩展题二:LeetCode 47. 全排列 II

题目来源:LeetCode 47. 全排列 II

序列中有重复的数字,要考虑重复,需要剪枝。

代码:

/** @lc app=leetcode.cn id=47 lang=cpp** [47] 全排列 II*/// @lc code=start
class Solution
{
private:vector<bool> visited;public:// 主函数vector<vector<int>> permuteUnique(vector<int> &nums){vector<vector<int>> ans;vector<int> seq;visited = vector<bool>(nums.size(), false);sort(nums.begin(), nums.end());backtrack(nums, 0, ans, seq);return ans;}// 辅函数void backtrack(vector<int> &nums, int level, vector<vector<int>> &ans, vector<int> &seq){if (level == nums.size()){ans.emplace_back(seq);return;}for (size_t i = 0; i < nums.size(); i++){if (visited[i] || (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1])){continue;}seq.emplace_back(nums[i]);visited[i] = true;backtrack(nums, level + 1, ans, seq);visited[i] = false;seq.pop_back();}}
};
// @lc code=end

复杂度分析:

时间复杂度:O(n × n!),其中 n 是数组 nums 的长度。回溯的调用次数是 O(n!),对于每个回溯的叶子节点,我们需要将当前答案使用 O(n) 的时间复制到答案数组中,相乘得时间复杂度为 O(n × n!)。

空间复杂度:O(n),其中 n 是数组 nums 的长度。我们需要 O(n) 的标记数组,同时在递归的时候栈深度会达到 O(n),因此总空间复杂度为 O(n+n)=O(2n)=O(n)。

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

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

相关文章

C# WPF上位机开发(ExtendedWPFToolkit扩展包使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 虽然个人认为当前的c# wpf内容已经足够多&#xff0c;但是肯定还是有很多个性化的需求没有满足。比如说不够好看&#xff0c;比如说动画效果不好&a…

解决ZooKeeper中/rmstore无法删除问题

无法删除znode /rmstore的原因在于yarn在注册时候候自己添加上ACL&#xff0c;导致无法直接删除。解决办法&#xff1a;重新设置ACL。 首先&#xff0c;查看ACL&#xff1a;getAcl /rmstore/ZKRMStateRoot 之后&#xff0c;重新设置ACL&#xff1a;setAcl /rmstore/ZKRMState…

【重点】【回溯】【DFS】79.单词搜索

题目 注意&#xff1a;此题跟岛屿的数量对比来看&#xff0c;增加了回溯的过程&#xff0c;岛屿题并无回溯。 法1&#xff1a;DFS 必须掌握方法&#xff01; class Solution {public boolean exist(char[][] board, String word) {char[] charArr word.toCharArray();int m…

SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?

文章目录 简介事务版本号行记录的隐藏列Undo LogRead View的工作流程总结参考文献 简介 在不同的DBMS里&#xff0c;MVCC的实现机制是不同的。本节我们会以InnoDB举例&#xff0c;讲解InnoDB里MVCC的实现机制。 我们需要掌握这么几个概念&#xff1a; 事务版本号行记录的隐藏…

任务十六:主备备份型防火墙双机热备

目录 目的 器材 拓扑 步骤 一、基本配置 配置各路由器接口的IP地址【省略】 1、配置BGP协议实现Internet路由器之间互联 2、防火墙FW1和FW2接口IP配置与区域划分 3、配置区域间转发策略 4、配置NAPT和默认路由 5、配置VRRP组&#xff0c;并加入Active/standby VGMP管…

代码随想录算法训练营第二十六天(回溯算法篇)|131. 分割回文串

131. 分割回文串 题目链接&#xff1a;131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 思路 分割字串和组合的题目有异曲同工之妙。 组合&#xff1a;选好数组中第一个数&#xff0c;接着选数组中第一个后面的数&#xff0c;进入递归。第一个树层代表选的第一个数…

Windows下配置最新ChromeDriver

1、问题 在使用代码调用谷歌浏览器时会出错&#xff1a; from selenium import webdriver driver webdriver.Chrome() SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser versi…

KSP音频抓包

1. 按照网上其他教程&#xff0c;安装KSP抓音频 Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;38&#xff09;-- KSP in MDE - 大大通(简体站) Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;22&#xff09;--DSP音频链路监听 - 大大通(简体站) <<Biu~笔记&#xff1a;高…

AX7A200教程(9): ov5640摄像头输出显示720p视频

一&#xff0c;功能框图 ov5640摄像头视频通过ddr3缓存后&#xff0c;最后使用hdmi接口进行输出显示 二&#xff0c;摄像头硬件说明 2.1&#xff0c;像头硬件管脚 如下图所示&#xff0c;一共18个管脚 2.2&#xff0c;摄像头电源初始化时序 因这个ov5640摄像头是买的老摄像…

JDK bug:ciObjectFactory::create_new_metadata

文章目录 1、问题2.详细日志3.JDK&#xff1a;bug最终bug链接&#xff1a; 京东遇到过类似bug各位大佬如果有更详细的解答可以留言。 1、问题 Problematic frame: V [libjvm.so0x438067] ciObjectFactory::create_new_metadata(Metadata*)0x327 关键字还是ciObjectFactory::cr…

图片懒加载和预加载

1.懒加载 延迟加载&#xff0c;当达到预定条件的时候&#xff0c;再加载对应的资源 实现 function lazyload&#xff08;&#xff09;{let imgs document.querySelectorAll(img)//获取浏览器滚动过的距离let scrollTop document.body.scrollTop || document.documentElemen…

关键字、标识符、变量、基本数据类型

一、关键字&#xff08;Keyword&#xff09; 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09; 特点&#xff1a;全部关键字都是小写字母 Java关键字查询关键地址&#xff1a; http:// https://docs.oracle.com/j…

Cmake基础(7)

这次是Cmake的重点&#xff0c;多项目 文章目录 add_subdirectoryget_filename_component变量作用域全局变量主目录定义变量可以在子目录访问到字目录定义PARENT_SCOPE变量可以在主目录访问到 添加依赖项 其实我们在一个cmake中使用多个add_excuatable 和add_library就能有多个…

电影小镇智慧旅游项目技术方案:PPT全文111页,附下载

关键词&#xff1a;智慧旅游项目平台&#xff0c;智慧文旅建设&#xff0c;智慧城市建设&#xff0c;智慧文旅解决方案&#xff0c;智慧旅游技术应用&#xff0c;智慧旅游典型方案&#xff0c;智慧旅游景区方案&#xff0c;智慧旅游发展规划 一、智慧旅游的起源 智慧地球是IB…

机器学习:增强式学习Reinforcement learning

收集有标签数据比较困难的时候同时也不知道什么答案是比较好的时候可以考虑使用强化学习通过互动&#xff0c;机器可以自己知道什么结果是好的&#xff0c;什么结果是坏的 Outline 什么是RL Action就是一个functionEnvironment就是告诉这个Action是好的还是坏的 例子 Space i…

算法专题二:滑动窗口

算法专题二&#xff1a;滑动窗口 一.长度最小的子数组&#xff1a;1.思路一&#xff1a;暴力解法2.思路二&#xff1a;滑动窗口双指针3.GIF题目解析&#xff1a;思路一&#xff1a;思路二&#xff1a; 二.无重复字符的最长子串&#xff1a;1.思路一&#xff1a;滑动窗口2.GIF题…

【selenium】自动化使用 chrome 的 user-data-dir

jwensh2023.12.18 文章目录 背景当前位置默认位置windowsMac OS XLinuxChrome操作系统AndroidiOS系统 覆盖用户数据目录命令行环境&#xff08;Linux&#xff09;编写 AppleScript 包装器 (Mac OS X) 用户缓存目录在 Mac OS X 和 iOS 上&#xff0c;用户缓存目录源自配置文件目…

Android-----AndroidManifests.xml 之meta-data

一、概念 meta-data&#xff1a;元数据、文件元数据。主要用来定义一些组件相关的配置值。 metadata是一组供父组件使用的名值对&#xff08;name-value pair&#xff09;&#xff0c;一个组件元素可以包含任意数量的meta-data子元素。这些子元素的值存放在一个 Bundle 对象中…

【具身智能评估9】Open X-Embodiment: Robotic Learning Datasets and RT-X Models

论文标题&#xff1a;Open X-Embodiment: Robotic Learning Datasets and RT-X Models 论文作者&#xff1a;– 论文原文&#xff1a;https://arxiv.org/abs/2310.08864 论文出处&#xff1a;– 论文被引&#xff1a;–&#xff08;12/18/2023&#xff09; 论文代码&#xff1a…

【数据库设计和SQL基础语法】--连接与联接--内连接和外连接的概念

一、引言 1.1 SQL连接的基本概念 SQL连接是一种在关系型数据库中使用的操作&#xff0c;用于将两个或多个表中的行关联起来。连接允许在查询中同时检索来自多个表的数据&#xff0c;通过共享一个或多个共同的列&#xff08;通常是主键或外键&#xff09;来建立关系。连接操作…