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

2024-06-03 09:12

本文主要是介绍【一刷《剑指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;}
};

六、举一反三

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

这篇关于【一刷《剑指Offer》】面试题 28:字符串的排列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026565

相关文章

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar

PHP7扩展开发之字符串处理

前言 这次,我们来看看字符串在PHP扩展里面如何处理。 示例代码如下: <?phpfunction str_concat($prefix, $string) {$len = strlen($prefix);$substr = substr($string, 0, $len);if ($substr != $prefix) {return $prefix." ".$string;} else

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

【附答案】C/C++ 最常见50道面试题

文章目录 面试题 1:深入探讨变量的声明与定义的区别面试题 2:编写比较“零值”的`if`语句面试题 3:深入理解`sizeof`与`strlen`的差异面试题 4:解析C与C++中`static`关键字的不同用途面试题 5:比较C语言的`malloc`与C++的`new`面试题 6:实现一个“标准”的`MIN`宏面试题 7:指针是否可以是`volatile`面试题 8:探讨`a`和`&a`