【一刷《剑指Offer》】面试题 28:字符串的排列

牛客对应题目链接:字符串的排列_牛客题霸_牛客网 (nowcoder.com)

力扣对应题目链接:LCR 157. 套餐内商品的排列顺序 - 力扣(LeetCode)

核心考点 :全排列问题, DFS。

一、《剑指Offer》对应内容


二、分析题目

全排列问题,可以看做如下多叉树形态:

很明显,我们想要得到合适的排列组合,一定是深度优先的。该问题可以把目标串理解成两部分:

  • 第一部分:以哪个字符开头。
  • 第二部分:剩下的是子问题。
所以,我们要让每个字符都要做一遍开头,然后再求解子问题。

三、代码

//牛客
//写法一
class Solution {
private:set<string> ans;vector<string> res;
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param str string字符串 * @return string字符串vector*/void swap(string &str, int i, int j){char temp=str[i];str[i]=str[j];str[j]=temp;}void dfs(string &str, int start){if(start==str.length()-1){ans.insert(str);return;}for(int i=start; i<str.size(); i++){swap(str, start, i);dfs(str, start+1);swap(str, start, i);}}vector<string> Permutation(string str) {int n=str.size();if(n<1) return {""};dfs(str, 0);for(auto s : ans)res.push_back(s);return res;}
};//写法二
class Solution {
private:set<string> ans;
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param str string字符串 * @return string字符串vector*/void dfs(string &str, int pos){if(pos==str.length()-1){ans.insert(str);return;}for(int i=pos; i<str.size(); i++){swap(str[pos], str[i]);dfs(str, pos+1);swap(str[pos], str[i]);}}vector<string> Permutation(string str) {if(str.size()<1) return {""};dfs(str, 0);return vector<string>({ans.begin(), ans.end()});}
};//力扣
class Solution {
private:set<string> ans;vector<string> res;
public:void dfs(string& goods, int pos){if(pos==goods.size()-1){ans.insert(goods);return;}for(int i=pos; i<goods.size(); i++){swap(goods[pos], goods[i]);dfs(goods, pos+1);swap(goods[pos], goods[i]);}}vector<string> goodsOrder(string goods) {dfs(goods, 0);for(auto s : ans)res.push_back(s);return res;}
};

四、扩展


五、相关题目

1、正方体的三面和

输入一个含有 8 个数字的数组,判断有没有可能把这 8 个数字分别放到正方体的 8 个顶点上(如图 4.15 所示),使得正方体上三组相对的面上的 4 个顶点的和都相等。

这相当于先得到 a1、a2、a3、a4、a5、a6、a7 和 a8 这 8 个数字的所有排列,然后判断有没有某一个的排列符合题目给定的条件,即 a1+a2+a3+a4==a5+a6+a7+a8,a1+a3+a5+a7==a2+a4+a6+a8,并且 a1+a2+a5+a6==a3+a4+a7+a8。


2、八皇后

在 8 X 8 的国际象棋上摆放 8 个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角线上。图 4.16 中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请问总共有多少种符合条件的摆法?

由于 8 个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占据一行。于是我们可以定义一个数组 ColumnIndex[8],数组中第 i 个数字表示位于第 i 行的皇后的列号。先把 ColumnIndex 的 8 个数字分别用 0~7 初始化,接下来就是对数组 ColumnIndex 做全排列。因为我们是不同的数字初始化数组,所以任意两个皇后肯定不同列。我们只需判断每一个排列对应的 8 个皇后是不是在同意对角线上,也就是对于数组的两个下标 i 和 j,是不是 i-j==ColumnIndex[i]-ColumnIndex[j] 或者 j-i==ColumnIndex[i]-ColumnIndex[j]。


力扣对应类似题目链接:51. N 皇后 - 力扣(LeetCode)

//写法一
class Solution {
private:vector<string> path;vector<vector<string>> res;vector<bool> checkCol, checkDg, checkUdg;
public:void dfs(int row, int n){if(row==n){res.push_back(path);return;}for(int col=0; col<n; col++){if (!checkCol[col] && !checkDg[row-col+n] && !checkUdg[row+col]){path[row][col]='Q';checkCol[col]=checkDg[row-col+n]=checkUdg[row+col]=true;dfs(row+1, n);checkCol[col]=checkDg[row-col+n]=checkUdg[row+col]=false;path[row][col]='.';}}}vector<vector<string>> solveNQueens(int n) {checkCol = vector<bool>(n, false);checkDg = vector<bool>(2*n, false);checkUdg = vector<bool>(2*n, false);path.resize(n);for(int i=0; i<n; i++)path[i].append(n, '.');dfs(0, n);return res;}
};//写法二
class Solution {
public:vector<vector<string>> res;void dfs(int x, int n, vector<string>& chessboard){if(x==n){res.push_back(chessboard);return;}for (int y=0; y<n; y++){if (isValid(x, y, n, chessboard)){chessboard[x][y]='Q';dfs(x+1, n, chessboard);chessboard[x][y]='.';}}}bool isValid(int x, int y, int n, vector<string>& chessboard){// 检查列for (int i=0; i<x; i++){if (chessboard[i][y]=='Q')return false;}// 检查 45度角是否有皇后for (int i=x-1, j=y-1; i>=0 && j>=0; i--, j--){if (chessboard[i][j]=='Q')return false;}// 检查 135度角是否有皇后for(int i=x-1, j=y+1; i>=0 && j<n; i--, j++){if (chessboard[i][j]=='Q')return false;}return true;}vector<vector<string>> solveNQueens(int n) {vector<string> chessboard(n, string(n, '.'));dfs(0, n, chessboard);return res;}
};

六、举一反三

如果面试题是按照一定要求摆放若干个数字,我们可以先求出这些数字的所有排列,然后再一一判断每个排列是不是满足题目给定的要求。

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

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

相关文章

JS(DOM、事件)

DOM 概念:Document Object Model&#xff0c;文档对象模型。将标记语言的各个组成部分封装为对应的对象: Document:整个文档对象Element:元素对象Attribute:属性对象Text:文本对象Comment:注释对象 JavaScript通过DOM&#xff0c;就能够对HTML进行操作: 改变 HTML 元素的内…

Windows端口本地转发

参考 微软Netsh interface portproxy 命令 界面端口代理的 Netsh 命令 | Microsoft Learn 使用Windows系统的portproxy功能配置端口转发 使用Windows系统的portproxy功能配置端口转发-阿里云帮助中心 (aliyun.com) 将来自0.0.0.0地址对端口35623的访问转发到172.18.106.16…

多维数组找最大值

调用JavaScript的一个内置函数&#xff1a;Math.max() <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

政安晨:【Keras机器学习示例演绎】(五十一)—— 利用广义网络、深度网络和交叉网络进行结构化数据学习

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文目标&#xff1a;使用 "宽深 "和 …

redis如何实现分布式锁

Redisson是怎么实现分布式锁的 分布式锁&#xff1a;Redisson 提供了一种简单而强大的方式来实现分布式锁。 它支持多种锁模式&#xff0c;如公平锁、可重入锁、读写锁等&#xff0c;并且提供了锁的超时设置和自动释放功能。 锁的获取 在Redisson中常见获取锁的方式有 lock() …

【代码随想录训练营】【Day 37】【贪心-4】| Leetcode 840, 406, 452

【代码随想录训练营】【Day 37】【贪心-4】| Leetcode 840, 406, 452 需强化知识点 python list sort的高阶用法&#xff0c;两个key&#xff0c;另一种逆序写法python list insert的用法 题目 860. 柠檬水找零 思路&#xff1a;注意 20 块找零&#xff0c;可以找3张5块升…

Mysql基础教程(13):GROUP BY

MySQL GROUP BY 【 GROUP BY】 子句用于将结果集根据指定的字段或者表达式进行分组。 有时候&#xff0c;我们需要将结果集按照某个维度进行汇总。这在统计数据的时候经常用到&#xff0c;考虑以下的场景&#xff1a; 按班级求取平均成绩。按学生汇总某个人的总分。按年或者…

“世界酒中国菜”系列活动如何助推乡村振兴和文化交流?

"世界酒中国菜"系列活动如何助推乡村振兴和文化交流&#xff1f; 《经济参考报》&#xff08;2024年5月24日 第6版&#xff09; 新华社北京&#xff08;记者 张晓明&#xff09; “世界酒中国菜”系列活动自启动以来&#xff0c;已在国内外产生了广泛影响。这一国家…

mysql面试之分库分表总结

文章目录 1.为什么要分库分表2.分库分表有哪些中间件&#xff0c;不同的中间件都有什么优点和缺点&#xff1f;3.分库分表的方式(水平分库,垂直分库,水平分表,垂直分表)3.1 水平分库3.2 垂直分库3.3 水平分表3.4 垂直分表 4.分库分表带来的问题4.1 事务一致性问题4.2 跨节点关联…

强化学习中Q值的概念

在强化学习中&#xff0c;Q值是一个非常核心的概念&#xff0c;用来表示在给定的状态下&#xff0c;采取某个特定动作所期望获得的总回报。Q值基本上是一种衡量“动作价值”的方式&#xff0c;即在当前状态采取一个动作能带来多大价值。 定义和计算 Q值通常表示为 (Q(s, a))&…

RabbitMQ小结

MQ分类 Acitvemq kafka 优点&#xff1a;性能好&#xff0c;吞吐量高百万级&#xff0c;分布式&#xff0c;消息有序 缺点&#xff1a;单机超过64分区&#xff0c;cpu会飙高&#xff0c;消费失败不支持重试 &#xff0c; Rocket 阿里的mq产品 优点&#xff1a;单机吞吐量也…

香橙派 Kunpeng Pro:基于ncnn的深度学习模型量化与部署实践

一 引言 近10年里以深度学习为代表的机器学习技术在图像处理&#xff0c;语音识别&#xff0c;自然语言处理等领域里取得了非常多的突破&#xff0c;其背后的核心算法是深度学习为代表的AI基础模型。 一般来讲&#xff0c;我们进行AI项目研发时&#xff0c;遵循三个步骤。 第…

LabVIEW步进电机的串口控制方法与实现

本文介绍了在LabVIEW环境中通过串口控制步进电机的方法&#xff0c;涵盖了基本的串口通信原理、硬件连接步骤、LabVIEW编程实现以及注意事项。通过这些方法&#xff0c;用户可以实现对步进电机的精确控制&#xff0c;适用于各种自动化和运动控制应用场景。 步进电机与串口通信…

python3.8环境下安装pyqt5

1.实验目的 测试python可视化工具包pyqt5,为后期做系统前端页面做铺垫 2.实验环境 1.软件 anaconda2.5 pycharm2024.1.1 pyqt5 2.硬件 GPU 4070TI Intel I7 1400K 3. 安装步骤 (base) C:\Users\PC>conda -V conda 23.7.4(base) C:\Users\PC>conda create qttest p…

GIS、GPS、RS综合应用

刘老师&#xff08;副教授&#xff09;&#xff0c;北京重点高校资深专家&#xff0c;拥有丰富的科研及工程技术经验&#xff0c;长期从事3S在环境中的应用等领域的研究和教学工作&#xff0c;具有资深的技术底蕴和专业背景。 第一章、3S 技术及应用简介 1.1、3S 技术及集成简…

跨模型知识融合:大语言模型的知识融合

大语言模型&#xff08;LLMs&#xff09;在多个领域的应用日益广泛&#xff0c;但确保它们的行为与人类价值观和意图一致却充满挑战。传统对齐方法&#xff0c;例如基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;虽取得一定进展&#xff0c;仍面临诸多难题&a…

wandb安装与使用 —— 用于跟踪、可视化和协作机器学习实验的工具

文章目录 一、wandb简介二、wandb注册与登陆&#xff08;网页&#xff09; —— 若登录&#xff0c;则支持在线功能三、wandb安装与登陆&#xff08;命令行&#xff09; —— 若不登录&#xff0c;则只保留离线功能四、函数详解4.1、wandb.init() —— 初始化一个新的 wandb 实…

上位机图像处理和嵌入式模块部署(f407 mcu中fatfs中间件使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们已经实现了spi norflash的驱动&#xff0c;理论上这已经可以实现数据的持久化保存了。为什么还需要一个文件系统呢&#xff1f;主要原因还…

在 Win系统安装 Ubuntu20.04子系统 WSL2 (默认是C盘,第7步开始迁移到D盘,也可以不迁移)

1、简介 WSL在Windows 10上原生运行Linux二进制可执行文件&#xff0c;不用单独安装虚拟机。 WSL2是WSL的第二个版本&#xff0c;提供了与WSL相比的显著性能改进和完全的系统呼叫兼容性。通过运行Linux内核在一个轻量级虚拟机&#xff08;VM&#xff09;中实现。 2、安装 电…