数据结构之字典序全排列

字典序法中,对于数字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

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

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

相关文章

敏捷实践:比每日会议更疯狂的半日会议!

由“每周例会”说起 每天项目例会的话&#xff0c;频率太高了&#xff0c;可能会浪费时间&#xff0c;如果每月一次&#xff0c;似乎时间太长了&#xff0c;于是我们往往会“每周例会”。 有一次我参加了某项目的每周例会&#xff0c;开会的时间是周五&#xff0c;会上其中一位…

智能生产的现状与未来!

来源&#xff1a;数字化企业北京机械工业自动化研究所首席专家蒋明炜先生是我国最早投身企业管理及其信息化事业的专家之一&#xff0c;积累了宝贵的理论实践经验&#xff0c;在国家提出《中国制造2025》之后&#xff0c;蒋明炜先生作为该领域资深专家&#xff0c;先后组织领导…

琐碎知识

在c/c中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈&#xff1a;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。堆&#xff1a;就是那…

82岁的北大教授证明了黎曼猜想?

来源&#xff1a;AI科技大本营最近&#xff0c;黎曼猜想有点热。上个月&#xff0c;89 岁的菲尔兹奖与阿贝尔奖双料得主、英国皇家学会院士迈克尔阿蒂亚爵士&#xff08;Michael Atiyah&#xff09;刚刚宣布自己证明了黎曼猜想。近日&#xff0c;82 岁的北大教授&#xff08;已…

Atlas机器人再秀逆天操作!波士顿动力科研or商业化,将何去何从?

来源&#xff1a;物联网智库在众多机器人相关的技术公司里&#xff0c;波士顿动力的核心特点在于&#xff0c;他们始终将「仿生」看作机器人设计的最高宗旨。其创始人Raibert 也称自己的目的是建造一种能和动物以及人一模一样的&#xff0c;完成一切事情的机器人。这既是波士顿…

OpenGL6-纹理动画

代码下载 #include "CELLWinApp.hpp"#include <gl/GLU.h>#include <assert.h>#include <math.h>#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glu32.lib")#pragma comment(lib,"winmm.lib") /*** 这个…

《科学美国人》:美国应保持太空、网络、生物领域的科技优势

来源&#xff1a;美国《科学美国人》转自&#xff1a;国防科技要闻&#xff08;ID&#xff1a;CDSTIC&#xff09;作者&#xff1a;军事科学院军事科学信息研究中心 吴海近日&#xff0c;美国《科学美国人》杂志发表《我们准备好迎接未来战争了吗&#xff1f;》一文&#xff…

hdu 4502 一维dp

吉哥系列故事——临时工计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2159 Accepted Submission(s): 807 Problem Description俗话说一分钱难倒英雄汉&#xff0c;高中几年下来&#xff0c;吉哥已经深…

微信开发入门

微信开发需要搭建PHP环境 参考链接&#xff1a;Apache2.2与php5.3.5如何整合&#xff1f;如何能够被使用_百度经验 搭建的过程出现了很多坑&#xff0c;只能小心&#xff0c;重复搭建了&#xff0c;错误原因可能是VC9或VC11环境没有配置的原因&#xff0c;多试试才行。 然后…

实现计算机界“大满贯”,芮勇博士再获技术成就大奖

来源&#xff1a;联想研究院近日&#xff0c;国际计算机协会&#xff08;ACM&#xff09;多媒体专委会&#xff08;Special Interest Group on Multimedia&#xff0c;简称SIGMM&#xff09;2018技术成就奖揭晓了。在全球众多的候选人当中&#xff0c;该奖最终花落联想集团首席…

PHP之MVC学习

代码架构进货过程 one&#xff0c;混编 嵌入式脚本语言PHP html与php混编的编码方式 two&#xff0c;显示和逻辑相分离 最后&#xff0c;需要将显示和逻辑的结果放在一起&#xff01; 需要在 php页面&#xff0c;将html代码 载入才可以&#xff01; <?php // 业务…

机器人流程自动化崛起,中国是否准备好迎接智能自动化时代?

来源&#xff1a;亿欧智库摘要&#xff1a;机器人流程自动化&#xff08;Robotic Process Automation, RPA&#xff09;正迅速成为企业改善服务、提高效率和降低成本的关键工具。对此&#xff0c;PWC针对国内RPA市场展开了调查&#xff0c;预计未来45%的工作活动可以实现自动化…

PHP之MVC项目实战

本文主要包括以下内容 类文件自动加载 路径管理 页面跳转 注册自动加载方法 配置文件系统 cookie session 类文件自动加载 在PHP中使用别的类时&#xff0c;需要载入类文件&#xff0c;如果类很多的话&#xff0c;需要重复写很多代码&#xff0c;所以利用__autoload魔法方法…

加州伯克利大学:自动驾驶中虚拟到现实的强化学习|厚势汽车

来源&#xff1a;同济智能汽车研究所UCB 提出了虚拟场景到真实场景的翻译网络&#xff0c;解决强化学习用于自动驾驶虚拟测试中与现实测试的差异。强化学习需要大量的试错&#xff0c;而真实的自动驾驶车辆&#xff08;AV&#xff09;无法提供大量的试错为此 AV 强化学习使用虚…

Effective C++ 第二版 1)const和inline 2)iostream

条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653 编译器永远不会看到ASPECT_R这个符号名, 在源码进入编译器之前, 就被预处理程序去掉, ASPECT_R 不会被加入到符号列表中; 编译报错时, 报错信息指向1.653, 让…

PHP之MVC项目实战(二)

本文主要包括以下内容 GD库图片操作 利用GD库实现验证码 文件上传 缩略图 水印 GD库图片操作 <?php$img imagecreatetruecolor(500, 300); //var_dumP($img); // //分配绿色 $green imagecolorallocate($img, 0, 0xff, 0x0); //var_dump($green);//fill $result ima…

2019年机器学习:追踪人工智能发展之路

作者&#xff5c;Hussain Fakhruddin编译&#xff5c;专知整理&#xff5c;Yingying&#xff0c;李大囧摘要&#xff1a;“智能助理”的时代已经到来了。机器学习已经成为全球数字化转型的关键要素之一 ,在企业领域&#xff0c;机器学习用例的增长在过去几年中也是显著的。预计…

PHP之MVC项目实战(三)

本文主要包括以下内容 标准错误错误处理 http操作 PDO 文件操作 标准错误错误处理 PHP在语法层面上发生的错误 两个过程&#xff1a; 触发阶段&#xff08;发生一个错误&#xff09; 处理阶段&#xff08;如何处理该错误&#xff09; 触发阶段 系统触发&#xff0c;…

价值2950亿美元的「量子霸权」,技术水平到了哪个阶段

来源&#xff1a;36Kr摘要&#xff1a;谁掌握了量子计算机&#xff0c;谁就可能引领下一次信息革命。当前经典计算体系&#xff0c;并不能解决所有问题。量子计算将给现有的计算理论带来深刻变革&#xff0c;将极大加深人类对物质与信息的理解&#xff1b;将是一种前所未有的计…

微信开发简单实例

本文主要包括以下内容 1. 微信聊天机器人 微信聊天机器人 利用图灵机器人接口实现微信聊天机器人 <?phpdefine("TOKEN", "weixin"); $wechatObj new wechatCallbackapiTest(); if (isset($_GET[echostr])) {$wechatObj->valid(); }else{$wec…