全排列算法问全排列公式解释
全排列算法 时间:2021-08-31 阅读:(
)
求遍历全排列的算法
全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。
常见的有四种全排列算法:
(A)字典序法
(B)递增进位制数法
(C)递减进位制数法
(D)邻位对换法
这里着重介绍字典序法
对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。
[例]字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,312,321。
[注意] 一个全排列可看做一个字符串,字符串可有前缀、后缀。
1)生成给定全排列的下一个排列 所谓一个的下一个就是这一个与下一个之间没有其他的。
这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。
[例]839647521是1--9的排列。
1—9的排列最前面的是123456789,最后面的是987654321,从右向左扫描若都是增的,就到了987654321,也就没有下一个了。
否则找出第一次出现下降的位置。
谁知C++求全排列的算法
#include <iostream>
#include <string>
#include <list>
using namespace std;
string slist="";
string sresult="";
int listlen=0;
int ex=0;
string permute(string list) {
string strreturn="";
int ln=list.length();
if( ln==2 ) {
strreturn=list;
char temp;
temp=list[0];
list[0]=list[1];
list[1]=temp;
return strreturn+list;
}
string substr="";
string strtemp="";
for(int i=0; i<ln; ++i) {
strtemp.clear();
substr.clear();
if( i>0 ) substr += list.substr(0,i);
if( i<ln-1 ) substr += list.substr(i+1, ln-1);
int lntemp=ln-1;
long FN=lntemp;
while( --lntemp!=1 ) FN*=lntemp;
lntemp=ln-1;
string str=permute(substr);
for(int j=0; j<FN; ++j) {
strtemp += list[i]+str.substr(j*lntemp, lntemp);
}
strreturn += strtemp;
}
return strreturn;
}
int main() {
cout<<"Enter the characters to permute: ";
getline(cin, slist);
listlen = slist.length()-1;
slist = slist.substr(0, listlen);
sresult=permute(slist);
int lntemp=listlen;
long FN=lntemp;
while( --lntemp!=1 ) FN*=lntemp;
//排除有3个连续字母的...
string str="";
lntemp=listlen;
for(int i=0; i<FN; ++i) {
str=sresult.substr(i*lntemp, lntemp);
for( int j=0; j<lntemp-2; ++j ) {
if( str[j]==str[j+1]-1 && str[j+1]==str[j+2]-1 ) {
sresult.erase( i*lntemp, lntemp ); //删除之
--i;
--FN;
cout<<str<<"..."; //显示被排除的排列
break;
}
}
}
cout<<endl;
for(int i=0; i<FN; ++i) {
str=sresult.substr(i*lntemp, lntemp);
cout<<str<<"...";
}
cout<<FN<<endl; //符合要求的排列数
}java 全排列算法;
= =~思路什么的...用递归吧:
package mon_11;
import java.util.HashSet;
public class ArrangeAll {
private static HashSet<String> set = new HashSet<String>();
public static void arrangeAll(String s) {
put(new StringBuilder(s), new StringBuilder());
}
static void put(StringBuilder s1, StringBuilder s2) {
if (s1.length() == 0)set.add(s2.toString());
for (int i = 0; i < s1.length(); i++) {
put(new StringBuilder(s1).deleteCharAt(i),new StringBuilder(s2).append(s1.charAt(i)));
}
}
public static void main(String[] args) {
arrangeAll("abcd");
System.out.println(set);
}
}
----
输出:
[dcab, acdb, acbd, bcda, bdca, bdac, dbca, bacd, cabd, cdba, cdab, badc, dabc, cadb, dbac, bcad, dacb, cbda, cbad, adbc, adcb, abcd, abdc, dcba]问全排列公式解释
可以这样解释: 第一次取球有8种可能,我们放在第一位; 第二次取球有7种可能(因为第一次已取走一个),我们放在第二位; 第三次取球有6种肯能(因为前两次已取走两个),我们放在第三位; 所以共有8*7*6种排列方法。
但是我们只要求球不同,而位置没要求, 那么三个位置,相同的一组三个球,有几种排列呢,6种,分别为: 1,2,3; 1,3,2; 2,1,3; 2,3,1; 3,1,2; 3,2,1。
所以如果不要求位置,三个球的组合为8*7*6/6=56。
如果是排列P83=8!/5!; 而组合是C83=P!/3! 不知我说明白了吗?
介绍:819云怎么样?819云创办于2019,由一家从2017年开始从业的idc行业商家创办,主要从事云服务器,和物理机器819云—-带来了9月最新的秋季便宜vps促销活动,一共4款便宜vps,从2~32G内存,支持Windows系统,…高速建站的美国vps位于洛杉矶cera机房,服务器接入1Gbps带宽,采用魔方管理系统,适合新手玩耍!官方网站:https://www.8...
物语云计算(MonogatariCloud)是一家成立于2016年的老牌国人商家,主营国内游戏高防独服业务,拥有多家机房资源,产品质量过硬,颇有一定口碑。本次带来的是美国圣何塞 Equinix 机房的高性能I9-10980XE大带宽VPS,去程CN2GIA回程AS9929,美国原生IP,支持解锁奈飞等应用,支持免费安装Windows系统。值得注意的是,物语云采用的虚拟化技术为Hyper-V,资源全...
久久网云怎么样?久久网云好不好?久久网云是一家成立于2017年的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,久久网云目前提供有美国免费主机、香港主机、韩国服务器、香港服务器、美国云服务器,香港荃湾CN2弹性云服务器。专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端服务部署,促使用户云端部署化简为零,轻松快捷运用云计算!多年云计算领域服务经验,遍布亚太地区的海量节点为...
全排列算法为你推荐
移动开发移动应用开发好就业吗方便快捷怎样瘦大腿方便,快捷!宵云九宵云外.是什么意思宵云< >感交集 <>宵云外 <>海为家 <>思而行 <>窍生烟 <>面威风accesspoint如何设置中国移动的APN(Access Point Names)接入点?2g内存条2G的内存条和8G的内存条有什么不同网通玩电信游戏卡怎么办网通怎么在电信玩游戏不卡解码器有什么用什么是播放器解码器照片ps是什么意思照片PS:PS是什么意思安卓手机用什么安全软件好手机应用软件下载哪个好用?我的手机是安卓系统的,帮忙推荐一个,谢谢
域名转让网 域名查询工具 域名查询软件 域名查询系统 vps优惠码 siteground wavecom 20g硬盘 英文简历模板word iis安装教程 商家促销 丹弗 韩国网名大全 阿里云浏览器 静态空间 腾讯实名认证中心 七夕快乐英语 qq金券 工信部icp备案查询 成都主机托管 更多