全排列----关于next_permutation()/prev_permutation() 函数的用法

简介: 全排列----关于next_permutation()/prev_permutation() 函数的用法

全排列

next_permutation 函数用于生成当前序列的下一个排序。它按照字典序对序列进行重新排序,如果存在下一个排列,则将当前序列更改为下一个排列,并返回true; 如果当前序列已经是最后一个排序,则将序列更改为第一个排列,并返回false.

vertor<int> nums = {1, 2, 3};
cout << "Initial permutation: ";
for(int num : nums){
    cout << num << " ";
} cout << endl;
//生成下一个排列
while(nevt_permutation(nums.begin(), nums.end()){
    cout << "Next permutation: ";
    for(int num : nums){
        cout << num << " ";
    } 
    cout << endl;
}
_ _
123
132
213
312
321

prev_permutation() 函数

prev_permutation 函数与 next_permutation 函数相反,它用于生成当前序列的上一个排序。它按照字典对序列进行重新排序,如果存在上一个排列,则将当前序列更改为上一个排序,并返回true; 如果当前序列已经是第一个排序,则将序列更改为最后一个排序,并返回false.

vertor<int> nums2 = {3, 2, 1};
cout << "Initial permutation: ";
for(int num : nums2){
    cout << num << " ";
} cout << endl;
//生成上一个排列
while(prev_permutation(nums2.begin(), nums2.end()){
    cout << "Prevous permutation: ";
    for(int num : nums2){
        cout << num << " ";
    } 
    cout << endl;
}
321
312
231
213
132
123

实例

题目

全排列

next_permutation()函数

next_permutation 函数用于生成当前序列的下一个排序。它按照字典序对序列进行重新排序,如果存在下一个排列,则将当前序列更改为下一个排列,并返回true; 如果当前序列已经是最后一个排序,则将序列更改为第一个排列,并返回false.

vertor<int> nums = {1, 2, 3};
cout << "Initial permutation: ";
for(int num : nums){
    cout << num << " ";
} cout << endl;
//生成下一个排列
while(nevt_permutation(nums.begin(), nums.end()){
    cout << "Next permutation: ";
    for(int num : nums){
        cout << num << " ";
    } 
    cout << endl;
}
_ _
123
132
213
312
321

prev_permutation() 函数

prev_permutation 函数与 next_permutation 函数相反,它用于生成当前序列的上一个排序。它按照字典对序列进行重新排序,如果存在上一个排列,则将当前序列更改为上一个排序,并返回true; 如果当前序列已经是第一个排序,则将序列更改为最后一个排序,并返回false.

vertor<int> nums2 = {3, 2, 1};
cout << "Initial permutation: ";
for(int num : nums2){
    cout << num << " ";
} cout << endl;
//生成上一个排列
while(prev_permutation(nums2.begin(), nums2.end()){
    cout << "Prevous permutation: ";
    for(int num : nums2){
        cout << num << " ";
    } 
    cout << endl;
}
321
312
231
213
132
123

实例

题目

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。我们假设对于小写字母有“a’<.

<'v<z,而且给定的字符串中的字母已经按照从小到大的顺序排列。

输入格式

输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

输出格式

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义已知S= siS2…Sk,T = ttz…tk,则S<等价于,存在p(1<p< k),使得s = t,s2=t2,…, Sp-1 = tp-l,Sp < t成立。

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    string str;
    getline(cin, str);
    int len = str.size();
    sort(str.begin(), str.end());

    bool tag = true;
    while (tag) {
        cout << str << endl;
        tag = next_permutation(str.begin(), str.end());
    }

    return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    string str;
    getline(cin, str);
    int len = str.size();
    sort(str.begin(), str.end());

    bool tag = true;
    while (tag) {
        cout << str << endl;
        tag = next_permutation(str.begin(), str.end());
    }

    return 0;
}


相关文章
|
XML 并行计算 算法
[Eigen中文文档] 求解稀疏线性系统
在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示,必须特别小心以获得良好的性能。本文列出了Eigen中可用的稀疏求解器。还介绍了所有这些线性求解器共同的主要步骤。根据矩阵的属性、所需的准确度,最终用户可以调整这些步骤以提高其代码的性能。请注意,并不需要深入了解这些步骤背后的内容:最后一节介绍了一个基础例程,可轻松使用以获取所有可用求解器的性能洞察。
1206 0
|
机器学习/深度学习 并行计算 API
Qwen2.5-1M: 支持100万Tokens上下文的开源Qwen模型
两个月前,Qwen团队升级了 Qwen2.5-Turbo,使其支持最多一百万个Tokens的上下文长度。今天,Qwen正式推出开源的 Qwen2.5-1M 模型及其对应的推理框架支持。
3256 28
|
缓存 AI芯片
飞桨x昇腾生态适配方案:02_常用环境变量
本节介绍训练前建议设置的常用环境变量,涵盖NPU私有格式、在线编译、性能优化参数(如`aclnn_scale`和`aclnn_split`)、算子黑名单配置、NPU卡号指定、Paddle内存分配策略及日志设置等内容。通过合理配置这些变量,可有效提升训练性能并解决潜在问题。例如,关闭`FLAGS_npu_storage_format`以禁用NPU私有格式,或调整`ASCEND_MAX_OP_CACHE_SIZE`优化Kernel缓存大小。同时,CANN和Paddle的日志环境变量也提供了调试支持。
696 0
|
C语言 C++ 容器
【数据结构】二叉搜索树(二叉排序树)
本文介绍了二叉搜索树(Binary Search Tree, BST)的定义、实现及其性能分析。二叉搜索树是一种特殊的二叉树,其特点是左子树所有节点值小于根节点值,右子树所有节点值大于根节点值,且每个子树也满足此特性。文中详细讲解了BST的节点结构、插入、查找、删除等操作的实现,并通过C++代码展示了这些功能。此外,还讨论了BST的性能:在理想情况下,时间复杂度接近O(logN),但在最坏情况下可能退化为O(N)。为了提高效率,后续将学习自平衡二叉搜索树如AVL树和红黑树。掌握BST有助于理解STL中的set和map容器。感谢阅读,欢迎点赞支持。
1631 9
|
机器学习/深度学习 Docker 容器
飞桨x昇腾生态适配方案:01_基础环境准备
本指南详细介绍在ARM环境中准备CANN环境、安装Paddle深度学习框架及PaddleCustomDevice的过程。首先下载并加载CANN镜像,启动Docker容器;接着通过日构建包或源码编译安装PaddlePaddle和PaddleCustomDevice;可选更新CANN版本时需注意环境变量配置与路径设置。最后提供基础功能检查方法,包括硬件后端、版本验证及框架健康检查,确保环境搭建成功。
1277 0
|
Linux 网络安全 Docker
安装后无法使用 Docker 命令
【10月更文挑战第3天】
2204 2
|
SQL 安全 关系型数据库
使用SQLMap进行SQL注入测试
使用SQLMap进行SQL注入测试
|
SQL 前端开发 JavaScript
前端vite+vue3结合后端node+koa——实现代码模板展示平台(支持模糊搜索+分页查询)
前端vite+vue3结合后端node+koa——实现代码模板展示平台(支持模糊搜索+分页查询)
627 4
|
存储 弹性计算 安全
阿里云服务器8核16G配置可选实例规格、收费标准及2024年优惠价格参考
阿里云服务器8核16G配置多少钱?可选实例规格有哪些?2024年的优惠价格是多少?根据阿里云2024年的收费标准及活动价格来看,8核16G配置云服务器的价格为3084.36元1年。阿里云服务器8核16G配置可选的规格有二十几个,不同实例的价格有所不同,下面是8核16G配置可选实例规格详解及优惠价格表。
2557 0
阿里云服务器8核16G配置可选实例规格、收费标准及2024年优惠价格参考
|
C++ C语言
MarkDown 常用语法
## 一、标题 最为常用的格式,只需要在文本前面加上 `#` 即可,同理、你还可以增加二级标题、三级标题、四级标题、五级标题和六级标题,总共六级,只需要增加 `#` 即可,标题字号相应降低 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 ###### 注:1)# 和[标题]之间需保留一个字符的空格,这是最标准的MarkDown写法;2)只有一级到六级标题(最多六级)。 ## 二、首行缩进、换行、空行、对齐方式 ##### 首行缩进 在 Markdown 中,`&emsp;`或`&#8195;` // 全角
995 1
MarkDown 常用语法

热门文章

最新文章