数据结构之字典序全排列
字典序法中,对于数字1、2、3……n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。
字典序算法如下:
设P是1~n的一个全排列:p=p1p2……pn=p1p2……pj-1pjpj+1……pk-1pkpk+1……pn
1)从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算),即 j=max{i|pi
实现
递归法
递归的话就很简单了,以{1,2,3}为例,它的排列是:
以1开头,后面接着{2,3}的全排列,
以2开头,后面接着{1,3}的全排列,
以3开头,后面接着{1,2}的全排列。
代码如下:
#include<iostream>
#include<algorithm>using namespace std;int arry[3] = { 1,2,3 };void Recursion(int s, int t)
{if (s == t)for_each(arry, arry + 3, [](int i) {printf("%d", i); }), printf("\n");else{for (int i = s; i <= t; i++){swap(arry[i], arry[s]);Recursion(s + 1, t);swap(arry[i], arry[s]);}}
}int main()
{Recursion(0, 2);return 0;
}
排序中有重复的情况
#include<iostream>
#include<algorithm>using namespace std;int arry[3] = { 1,2,2 };bool IsEqual(int s, int t)
{for (int i = s; i < t; i++)if (arry[i] == arry[t])return true;return false;
}void Recursion(int s, int t)
{if (s == t)for_each(arry, arry + 3, [](int i) {printf("%d", i); }), printf("\n");else{for (int i = s; i <= t; i++){if (!IsEqual(s, i))//不相等才能交换{swap(arry[i], arry[s]);Recursion(s + 1, t);swap(arry[i], arry[s]);}}}
}int main()
{Recursion(0, 2);return 0;
}
利用STL中的next_permutation方法
//简短的AC代码。调用了STL的next_permutation函数vector<string> Permutation(string str) {vector<string> answer;if(str.empty())return answer; sort(str.begin(),str.end());do{answer.push_back(str);}while(next_permutation(str.begin(),str.end()));return answer;
}
字符串字典排序
class Solution {
public:vector<string> Permutation(string str) {//可以用递归来做vector<string> array;if(str.size()==0)return array;Permutation(array, str, 0);sort(array.begin(), array.end());return array;}void Permutation(vector<string> &array, string str, int begin)//遍历第begin位的所有可能性{if(begin==str.size()-1)array.push_back(str);for(int i=begin; i<=str.size()-1;i++){if(i!=begin && str[i]==str[begin])//有重复字符时,跳过continue;swap(str[i], str[begin]);//当i==begin时,也要遍历其后面的所有字符;//当i!=begin时,先交换,使第begin位取到不同的可能字符,再遍历后面的字符Permutation(array, str, begin+1);//遍历其后面的所有字符;swap(str[i], str[begin]);//为了防止重复的情况,还需要将begin处的元素重新换回来/*举例来说“abca”,为什么使用了两次swap函数交换时是a与b交换,遍历;交换时是a与c交换,遍历;(使用一次swap时,是b与c交换)交换时是a与a不交换;*/}}
};
参考链接:
全排列的实现方法–递归&字典序 - 半壶老酒 - 博客频道 - CSDN.NET
字典序全排列 - zwb8848happy的专栏 - 博客频道 - CSDN.NET
数据结构之字典序全排列相关推荐
- java 分治法排序_分治法实现1-N的数字按字典序全排列组合 Java语言
package 分治法; import java.util.Arrays; /* * 将数字 1 - n进行全排列 按字典序从小到大输出 * 如 1 - 3 * 123 132 213 231 312 ...
- 字典序全排列算法(非递归全排列算法)
非递归全排列算法: 我们先看一个例子. 示例: 1 2 3的全排列如下: 1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1 我们这里是通过字典序法找出来的. ...
- 35-面试:如何找出字符串的字典序全排列的第N种
http://www.cnblogs.com/byrhuangqiang/p/3994499.html 转载于:https://www.cnblogs.com/zhumengdexiaobai/p/7 ...
- 全排列的生成算法:字典序法
全排列的生成算法:字典序法 全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来. 字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...
- 全排列(从大到小排列)
在大佬的讲解下终于明白了这个基础问题qaq #include<bits/stdc++.h> using namespace std; int a[1001],f[1001],ba[1001 ...
- 【算法】全排列的四种思路
一.公式 n个元素全排列,有n!种排列方式. 即: f(n) = n! 二.实现思路及代码 思路一:头中尾插入法--单路递归 先对前n-1个字符全排列,得到全排列集合后,对集合中每个排列,第n个字符都 ...
- 28-字符串全排列问题
问题描述 打印给定字符串的所有排列情况. 例如 输入字符串'abc',则打印出它的全排列形式: abc acb bac bca cab cba [注意]写算法时要考虑到有相同元素的情况: 输入字符串' ...
- java break递归_【Java】递归总结
摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的 ...
- 算法基础课【合集1】
文章目录 基础算法 785. 快速排序 786. 第k个数 787. 归并排序 788. 逆序对的数量 789. 数的范围 790. 数的三次方根 791. 高精度加法 792. 高精度减法 793. ...
最新文章
- 为什么静态方法无法直接调用非静态成员变量和方法
- jquery.cycle.js
- python单元测试框架-Python unittest单元测试框架总结
- linux级别3怎么配置DNS,Linux下DNS服务器配置详解
- acwing2041. 干草堆(差分数组)
- android多点触摸手势,安卓手势学习笔记(三) 多点触控
- 谷粒商城基础篇爬坑笔记--项目导入intellij IDEA后pom.xml无法识别为maven文件和程序包import com.atguigu.common.XXX不存在两个问题解决方法
- 如何在C#中使用反射获取集合元素类型
- SpringBoot之Interceptor拦截器注入使用
- 小程序思维导图(基础图)
- http 415 错误
- c语言max函数和min,使用函数获取值,查找max,查找min并以C语言显示
- MySQL之desc查看表结构的详细信息
- 知名互联网公司都在使用哪些数据库
- 自己编写代码去听网易云音乐的歌曲,以及观看MV,还可以下载奥
- 快速入门开发实现订单类图片识别结果抽象解析
- spark数据处理-RDD
- ESP8266 由Noboot 模式到 boot模式
- Deep Learning(1)
- 中国石油大学计算机学院在哪个校区,中国石油大学(华东)有几个校区及校区地址 哪个校区最好...
热门文章
- GPT-3诞生,Finetune也不再必要了!NLP领域又一核弹!
- 论文浅尝 - CIKM2021 | DT-GCN: 一种双曲空间中的数据类型感知的知识图谱表示学习模型...
- 技术动态 | ACL 2019 知识图谱的全方位总结
- 论文浅尝 | 基于平行新闻的Bootstrapping关系抽取
- 哈工大LTP本地安装及python调用
- Android官方开发文档Training系列课程中文版:支持不同的设备之支持不同的平台版本
- 【LeetCode】3月26日打卡-Day11
- Java基础语法之Map
- 使用less实现自适应宽度
- 分别安装搭建lamp服务环境