元素无重复:

  如:2,5,8,9.

  思路:用递归的方法解决,对于2589,先输出所有以2开头的排列,然后输出5开头的排列.....(此处称为递归操作A)。以2开头的排列中,第一位是2,后面的是589,然后对589执行相同的递归操作A......

  代码如下:

  

 #include<iostream>
using namespace std;
void print_permutation(int n,int *A,int *B,int cur){//n为目标数组长度,cur为对全排列序列A递归操作的下标
if(cur==n){//递归出口
for(int i=;i<n;i++)//打印全排列序列
cout<<A[i]<<" ";
cout<<endl;
}
else
for(int i=;i<n;i++){//扫描目标数组
int ok=;
for(int j=;j<cur;j++){
if(A[j]==B[i]){
ok=;//对A中已有元素(cur下标前的元素)进行扫描,若发现A中已经存在B[i]的值时,说明B[i]元素已经排列过。
break;
}
}
if(ok){//若B[i]未排列过,则将B[i]添加到A序列末尾,将cur指针后移一位,进行下一步递归操作。
A[cur]=B[i];
print_permutation(n,A,B,cur+);
}
}
} int main(){
int a[]={};//全排列序列,即输出结果
int b[]={,,,};// 目标数组
print_permutation(,a,b,);
return ;
}

元素有重复:

  修改两个地方:

  1.因为元素可以重复,所以不能再用“A中是否已经存在B数组”的条件来决定是否添加B[i]元素。取而代之,分别对A,B数组扫描,只要A中的B[i]不超过B中的B[i]即可。

  2.在题目要求上,重复元素属于相同元素时,如1123的排列中1123和1123是等价的,只能算一种。我们最好先对B数组排个序(排序复杂度是nlogn,相较于两层循环的代,影响并不是很大),然后在最外层循环添上一个控制条件(i==0||B[i]!=B[i-1]),为的就是防止重复的元素又一次排列。

  代码如下:

  

 #include<iostream>
using namespace std;
void print_permutation(int n,int *A,int *B,int cur) {
if(cur==n) {
for(int i=; i<n; i++)
cout<<A[i]<<" ";
cout<<endl;
} else
for(int i=; i<n; i++) {
if(!i||B[i]!=B[i-]) {
int c1=,c2=;
for(int j=; j<cur; j++)//扫描A中已有B[i]的个数
if(A[j]==B[i]) c1++;
for(int j=; j<n; j++)//扫描B中所有B[i]的个数
if(B[j]==B[i]) c2++;
if(c1<c2) {
A[cur]=B[i];
print_permutation(n,A,B,cur+);
}
}
}
} int main() {
int a[]= {};
int b[]= {,,,};
print_permutation(,a,b,);
return ;
}

  

全排列递归算法(元素有重复与无重复,C++实现)的更多相关文章

  1. 从无重复大数组找TOP N元素的最优解说起

    有一类面试题,既可以考察工程师算法.也可以兼顾实践应用.甚至创新思维,这些题目便是好的题目,有区分度表现为可以有一般解,也可以有最优解.最近就发现了一个这样的好题目,拿出来晒一晒. 1 题目 原文: ...

  2. hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明

    题目:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11313 湖师大的比赛,见我的另一篇水题题解,这里要说的 ...

  3. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  4. lintcode: 最长无重复字符的子串

    题目 最长无重复字符的子串给定一个字符串,请找出其中无重复字符的最长子字符串. 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 ...

  5. [LeetCode] 3. 无重复字符的最长子串

    题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...

  6. Set.js--创建无重复值的无序集合

    Set 集合,不同于 Array,是一种没有重复值的集合. 以下代码出自于<JavaScript 权威指南(第六版)>P217,注意:这里并不是指 es6 / es2015 中的 Set ...

  7. day4——无重复字符的最长子串

    // 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法 题干 //给定一个字符串,请你找出其中不含有重复字符的 最长子串 ...

  8. 【LeetCode】无重复字符串最长子串

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a ...

  9. LeetCode(3):无重复字符的最大子串

    本内容是LeetCode第三道题目:无重复字符的最大子串 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 20:14: ...

随机推荐

  1. 关于Http

    摘自:菜鸟教程 HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(www)服务器传输超文本到本地浏览器的传送协议. HTTP ...

  2. process.nextTick

    回调函数同步执行 function asyncFake(data, callback) { if(data === 'foo') { callback(true); }else{ callback(f ...

  3. NOIP 2018 大翻车记

    都9102年了我才想起来写游记啊 Day -1 肚子里翻江倒海,一天去了七次厕所.吃了PPA把病压下去.安慰一下自己,说这样会涨人品. Loli讲述学长们的翻车笔记.我大概像是玩笑一样听过去了.(伏笔 ...

  4. ASP.NET Core 搭配 Nginx 的真实IP问题

    一.前言 Nginx(Engine X)是一个高性能HTTP和反向代理服务,是由俄罗斯人伊戈尔·赛索耶夫为访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发 ...

  5. 哈尔滨工业大学(威海)第九届ACM程序设计竞赛 Virtual Youtuber

    链接 [https://ac.nowcoder.com/acm/contest/624/G] 题意 其实题意说的辣鸡死了,没有说明确. y is the subsequences that its s ...

  6. protobuf使用详解

    https://blog.csdn.net/skh2015java/article/details/78404235 原文地址:http://blog.csdn.net/lyjshen/article ...

  7. 【转】Linux之crontab定时任务命令

    1.  crontab命令概念 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使 ...

  8. MYSQL GTID position

    MySQL5.6 新特性之GTID - jyzhou - 博客园 http://www.cnblogs.com/zhoujinyi/p/4717951.html MySQL · 答疑释惑 · GTID ...

  9. gVim编辑器 操作篇

    gVim是一款强大的编辑器,可以满足大部分语言的编程需要.尤其是其自带的模板定制功能对于Verilog来说非常受用.然而gVim有很多操作是不同于其他编辑器的,这让很多初学者望而却步,因此,本文将gV ...

  10. Python进阶11---异常及模块化

    异常处理 异常Exception 产生异常