全排列算法问全排列公式解释
全排列算法 时间: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! 不知我说明白了吗?
官方网站:点击访问青云互联活动官网优惠码:终身88折扣优惠码:WN789-2021香港测试IP:154.196.254美国测试IP:243.164.1活动方案:用户购买任意全区域云服务器月付以上享受免费更换IP服务;限美国区域云服务器凡是购买均可以提交工单定制天机防火墙高防御保护端口以及保护模式;香港区域购买季度、半年付、年付周期均可免费申请额外1IP;使用优惠码购买后续费周期终身同活动价,价格不...
快快CDN主营业务为海外服务器无须备案,高防CDN,防劫持CDN,香港服务器,美国服务器,加速CDN,是一家综合性的主机服务商。美国高防服务器,1800DDOS防御,单机1800G DDOS防御,大陆直链 cn2线路,线路友好。快快CDN全球安全防护平台是一款集 DDOS 清洗、CC 指纹识别、WAF 防护为一体的外加全球加速的超强安全加速网络,为您的各类型业务保驾护航加速前进!价格都非常给力,需...
公司成立于2021年,专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、三线高防、香港等优质的IDC资源。公司一直秉承”以人为本、客户为尊、永续创新”的价值观,坚持”以微笑收获友善, 以尊重收获理解,以责任收获支持,以谦卑收获成长”的行为观向客户提供全面优质的互...
全排列算法为你推荐
提升网站排名如何提高网站排名互联网接入互联网接入口指的是什么文件名长度windows文件名最长能到多少?宵云九宵云外.是什么意思无线存储带wifi的sd卡怎么用安卓手机用什么安全软件好电脑管理安卓手机的软件哪个最好用小时代发布会完整版乐视视频·小时代版是什么捏?大数据人才培养大数据时代如何进行人才管理与规划宽带包月宽带包月一月多少钱?本地连接断开本地连接老是断开怎么解决
免费域名 顶级域名 西部数码vps 三级域名网站 国外永久服务器 华为云服务 bbr ion 轻博客 debian6 国外在线代理 河南服务器 建立邮箱 新天域互联 宁波服务器 cdn加速原理 免费申请个人网站 登陆空间 阿里云官方网站 新加坡空间 更多