全排列算法解析(视频+详解+代码+STL)

全排列生成算法

刚开始自学的时候搜了两三个scdn中关于讲解全排列问题的博客,但是我理解能力比较差还是没有完全理解

,后来就在网上搜索了视频才完全弄懂,现在把我理解的分享给你们。

学习视频:http://v.ku6.com/show/RP7r6vew4Qb_MCF1eYZeOg...html

1、  没有重复字符的全排列问题

例如:对abcd进行全排列

如图:

分析:a b c d

1、  定a 对b c d进行全排列 

2、  定 b对a c d进行全排列

3、  定c 对a b d进行全排列

4、  定d 对a b c进行全排列

很明显这个涉及到递归的思想,

#include<iostream>
#include<cstring>
using namespace std;
char str[]="abcd";
void permitation(int from,int to)
{if(from==to)//相当于a->d后就输出{for(int i=0;i<=to;i++){cout<<str[i];//输出其中一种排列的情况}cout<<endl;return;//递归出口,结束当前递归,以便对接下来的进行全排列}for(int i=from;i<=to;i++){swap(str[i],str[from]);//让首字母与其中的某个字符进行交换操作,例如上文中对的分析abcd的全排列中,//开始首字母是a,接下来是b,然后是c最后是d,这就涉及到swap操作,第一次因为from=0,i=0,自己交换自己之后就真正的交换permitation(from+1,to);swap(str[i],str[from]);//做完之后再交换回来,保证维系原来abcd的顺序,以便下一次进行全排列}
}
int main(){int size=strlen(str);//获得字符串长度permitation(0,size-1);return 0;
}

2、  出现重复字符的全排列问题

例如:1223

1-223

2-123

3-221

带重复字符的全排列就是每个字符分别与它后面非重复重现字符的进行交换

即:第i个字符与第j个字符交换时,要求[I,j)中没有与第j个字符相等的数出现

代码:(知识加了一个判断条件)

/*无重复字符情况的全排列问题*/

#include<iostream>
#include<cstring>
#include<algorithm>
using namespacestd;
char str[1000];
int isSwap(intfrom,int to)
{bool flag=true;for(int i=from;i<to;i++){if(str[to]==str[i]){flag=false;break;}}return flag;
}
voidpermitation(int from,int to)
{if(from==to)//相当于a->d后就输出{for(int i=0;i<=to;i++){cout<<str[i];//输出其中一种排列的情况}cout<<endl;             return;//递归出口,结束当前递归,以便对接下来的进行全排列}for(int i=from;i<=to;i++){if(!isSwap(from,i))continue;swap(str[i],str[from]);//让首字母与其中的某个字符进行交换操作,例如上文中对的分析abcd的全排列中,//开始首字母是a,接下来是b,然后是c最后是d,这就涉及到swap操作,第一次因为from=0,i=0,自己交换自己之后就真正的交换permitation(from+1,to);swap(str[i],str[from]);//做完之后再交换回来,保证维系原来abcd的顺序,以便下一次进行全排列}
}
int main(){while(1){printf("Please input astring:");cin>>str;sort(str,str+strlen(str));intsize=strlen(str);//获得字符串长度permitation(0,size-1);}return 0;
}


3、  知道原理之后下次用的时候可以直接利用STL中的库函数来做,库函数不用考虑是否有重复字符出现特别方便

代码:

 

#include<iostream>
#include<cstring>
#include<algorithm>
using namespacestd;
char str[1000];
int main(){while(1){printf("Please input astring:");cin>>str;sort(str,str+strlen(str));//从stl库中调用全排列的库函数do{for(inti=0;i<strlen(str);i++){cout<<str[i]<<"";}cout<<endl;}while(next_permutation(str,str+strlen(str)));}return 0;
}


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

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

相关文章

数据库 PolarDB 开源之路该如何走?听听他们怎么说

阿里巴巴集团副总裁、阿里云数据库事业部负责人李飞飞出席了沙龙并致开场辞&#xff1a;PolarDB 是阿里云的明星产品&#xff0c;做出将PolarDB 开源的决策需要非常大的勇气。将最核心的数据库产品对外开源&#xff0c;且使用了最友好的协议&#xff0c;阿里云是全球头部云厂商…

通过定时 SQL 提取阿里云API 网关访问日志指标

背景 阿里云API网关服务提供API托管服务&#xff0c;提供了强大的适配和集成能力&#xff0c;可以将各种不同的业务系统API实现统一管理。API网关同时支持将API访问日志一键存储到日志服务&#xff0c;通过日志服务强大的查询分析能力&#xff0c;用户可以针对访问日志自定义计…

HDU 3573(详解+思路+代码)

Description Imyourgod need 3 kinds of sticks(树枝) which have different sizes: 20cm, 28cm and 32cm. However the shop only sell 75-centimeter-long sticks. So he have to cut off the long stick. How many sticks he must buy at least. Input The first line of…

2022云栖现场|体验阿里巴巴工作数字化实践

越来越多的企业主动拥抱数字化转型&#xff0c;借助数字化工具提高企业运营效率&#xff0c;实现企业目标落地、帮助员工成长。 2022云栖大会&#xff0c;阿里巴巴企业智能带来阿里数字化工作方法与企业IT解决方案&#xff0c;展示着阿里内部在办公协同与IT管理上的实际应用场…

K8s 场景下 Logtail 组件可观测方案升级-Logtail 事件监控发布

背景 随着K8s和云的普及&#xff0c;越来越多的公司将业务系统部署到云上&#xff0c;并且使用K8s来部署应用。Logtail是SLS提供的日志采集Agent&#xff0c;能够非常好的适应K8s下各种场景的日志采集&#xff0c;支持通过DaemonSet方式和Sidecar方式采集Kubernetes集群的容器…

一图看懂,阿里云飞天企业版如何支持政企数智创新

杭州&#xff0c;2022年11月5日 – 今日&#xff0c;在云栖大会专有云技术和应用实践论坛&#xff0c;阿里云重磅发布飞天企业版在建云、管云、用云方面的全面升级&#xff0c;并邀请行业专家、政企客户代表和合作伙伴面向未来十年共话新一代政企IT发展趋势&#xff0c;分享阿里…

hdu3579(中国剩余问题经典)

Description One day I was shopping in the supermarket. There was a cashier(收银员) counting coins seriously when a little kid running and singing "门前大桥下游过一群鸭&#xff0c;快来快来 数一数&#xff0c;二四六七八". And then the cashier put t…

关于HTTPDNS,你知道多少?

什么是HTTPDNS&#xff1f; HTTPDNS是面向多端应用&#xff08;移动端APP&#xff0c;PC客户端应用&#xff09;的域名解析服务&#xff0c;具有域名防劫持、精准调度、实时解析生效的特性。 HTTPDNS工作流程 客户端直接访问HTTPDNS接口&#xff0c;获取业务在域名配置管理系…

当大火的文图生成模型遇见知识图谱,AI画像趋近于真实世界

导读 用户生成内容&#xff08;User Generated Content&#xff0c;UGC&#xff09;是互联网上多模态内容的重要组成部分&#xff0c;UGC数据级的不断增长促进了各大多模态内容平台的繁荣。在海量多模态数据和深度学习大模型的加持下&#xff0c;AI生成内容&#xff08;AI Gen…

最大最小距离算法(K-MEANS K-medoids )聚类算法的结合运用

聚类算法通常会得到一种分类&#xff0c;将n个点聚合成k类&#xff0c;同一聚类&#xff08;即插槽簇&#xff09;中的对象相似度较高&#xff1b;而不同类中的对象相似度较小。聚类算法的基本流程如下&#xff1a;&#xff08;1&#xff09;从n个节点中选择 k 个节点作为初始聚…

使用 EasyCV Mask2Former 轻松实现图像分割

导言 图像分割(Image Segmentation)是指对图片进行像素级的分类&#xff0c;根据分类粒度的不同可以分为语义分割(Semantic Segmentation)、实例分割(Instance Segmentation)、全景分割(Panoptic Segmentation)三类。图像分割是计算机视觉中的主要研究方向之一&#xff0c;在医…

八皇后问题详解(最短代码)

八皇后问题算法分析&#xff1a; 分析1&#xff1a;八皇后由一个64格的方块组成&#xff0c;那么把八个皇后放入不考虑其他情况利用穷举法&#xff0c;有8^64种 可能。 分析2&#xff1a;显然任意一行有且仅有1个皇后&#xff0c;使用数组queen[0->7]表示第i行的皇后位于哪一…

5个编写技巧,有效提高单元测试实践

1. 什么是单元测试 “在计算机编程中&#xff0c;单元测试又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中&#xff0c;一个单元就是单个程序、函数、过程等&#xff1b;对于面向对象编程&#xff0c;最…

谈谈我工作中的23个设计模式

序 从基础的角度看&#xff0c;设计模式是研究类本身或者类与类之间的协作模式&#xff0c;是进行抽象归纳的一个很好的速成思路。后面阅读设计模式后&#xff0c;为了加深理解&#xff0c;对相关图片进行了描绘和微调。 从技术的角度已经有很多好的总结&#xff0c;本文会换…

三种方法求最长子序列问题

#include<iostream> #include<algorithm> using namespace std; int maxsum(int a[],int x,int y) {int v,l,r;if(y-x1)//只有一个元素&#xff0c;直接返回 return a[x];int mx(y-x)/2;//分治法第一步&#xff0c;划分成[x,m)和[m,y)int maxsmax(maxsum(a,x,m),ma…

OpenSergo 流量路由:从场景到标准化的探索

流量路由&#xff0c;顾名思义就是将具有某些属性特征的流量&#xff0c;路由到指定的目标。流量路由是流量治理中重要的一环&#xff0c;多个路由如同流水线一样&#xff0c;形成一条路由链&#xff0c;从所有的地址表中筛选出最终目的地址集合&#xff0c;再通过负载均衡策略…

传统 Web 框架部署与迁移

与其说 Serverless 架构是一个新的概念&#xff0c;不如说它是一种全新的思路&#xff0c;一种新的编程范式。 但是原生的 Serverless 开发框架却非常少。以 Web 框架为例&#xff0c;目前主流的 Web 框架“均不支持 Serverless 模式部署”&#xff0c;因此我们一方面要尝试接…

归并排序(视频+详解+代码)

归并排序 概述&#xff1a;归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使…

三款“非主流”日志查询分析产品初探

前言 近些年在开源领域&#xff0c;用于构建日志系统的软件有两类典型&#xff1a; Elasticsearch&#xff1a;基于 Lucene 构建倒排索引提供搜索功能&#xff0c;DocValue 存储支持了其统计分析能力。Clickhouse&#xff1a;列式存储是其优秀 OLAP 性能的保障。 这里把上述系…

C++ Set常用用法

set集合容器&#xff1a;实现了红黑树的平衡二叉检索树的数据结构&#xff0c;插入元素时&#xff0c;它会自动调整二叉树的排列&#xff0c;把元素放到适当的位置&#xff0c;以保证每个子树根节点键值大于左子树所有节点的键值&#xff0c;小于右子树所有节点的键值&#xff…