全排列(最快速next permutation)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[210];
int main()
{
    while(scanf("%s",a)!=EOF)
    {
        int len = strlen(a);
        sort(a, a+len);
        cout << a << endl;
        int k = 1;
        while(next_permutation(a, a+len))
        {
            cout << a << endl;
            k++;
//            cout << k << endl;
        }
        cout << k << endl;
    }
    string str;
    cin >> str;
    sort(str.begin(),str.end());
    cout << str << endl;
    while (next_permutation(str.begin(), str.end()))
        cout << str << endl;
    return 0;
}

时间: 2024-10-06 09:50:07

全排列(最快速next permutation)的相关文章

全排列算法-Java

第一步,排列的精髓是交换和顺序处理,比如,考虑[1,2,3,4]排列,实际上是,1和1,2,3,4分别交换得来 1和1交换:[1],[2,3,4] 1和2交换:[2],[1,3,4] 1和3交换:[3],[2,1,4] 1和4交换:[4],[2,3,1] 那么下面分别考虑上面的四个结果,比如,考虑 [1],[2,3,4] 第二步,我们把[1]固定不变,考虑[2,3,4],把它看成是2和2,3,4分别交换,得到如下结果: [1]固定,2和2交换:[1],[2],[3,4] [1]固定,2和3交换:

数组的全排列

1.问题背景 学过数学的人都知道,全排列的意思是什么.现在如何用计算机的编程语言实现数组的全排列呢? 数组的全排列可用于求解八皇后问题,具体参见:全排列解决八皇后问题.与此同时,全排列经常会出现在笔试或者面试,如求字符串的全排列.之所以那它作为考题,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平.所以,掌握它很重要. 2.全排列的递归实现 2.1求解思路 全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数

算法题丨Next Permutation

描述 Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replac

枚举排列

字典序排列:一个个的递归填充: 1:1-n的全排列 int n; void permutation(int cur,int *A) { if(cur==n) { for(int i=0;i<n;i++) printf("%d ",A[i]); printf("\n"); return; } for(int i=1;i<=n;i++) { int ok=0; for(int j=0;j<cur;j++) //判断前面是否出现过 if(A[j]==i)

利用编程解决一道数学题

问题 在朋友QQ空间看到一道题,如下: 当时顺手画了条数轴,在数轴上标出了各个算式的解的特点:和为7的算式的解关于4对称,和为9的解关于5对称等等.草草算了下,发现很难同时满足5个条件.而细算又太麻烦,算了,反正是程序员,写程序求解吧. 利用笛卡尔积求解 因为是4个算式,很自然的就想到穷举法.将每个算式可能的结果放在一起算笛卡尔积,如果有解的话,则必然存在一个笛卡尔积里面存在1到8这8个不同的元素. 计算笛卡尔积的代码如下: /// <summary> /// 计算元素集列表的笛卡尔积 ///

减一技术应用:生成排列与幂集(Java实现)

减一技术,与二分搜索一样,是一种通用算法设计技术.它是分治法的一种特殊形式,通过建立问题实例P(n) 与问题实例P(n-1)的递推求解关系式而实现:最经典的例子莫过于插入排序了.这里,给出减一技术在生成排列组合方面的应用. (一)  排列问题: 生成自然数 1,2,,,,,n 的所有排列. 算法描述: 使用减一技术,建立自然数12...n的排列与12...n-1的递推关系.假设 P(n-1) 是 自然数 12...n-1的所有排列 p1, p2,..., p(m)的集合,则P(n)通过如下方式得

第44课 递归的思想与应用(中)

1. 单向链表的转置 [编程实验]单向链表的转置(Node* reverse(Node* list)) 2. 单向排序链表的合并 [编程实验]单向排序链表的合并(Node* merge(Node* list1, Node* list2)) 3. 汉诺塔问题 (1)游戏规则 ①将木块借助B柱由A柱移动C柱 ②每次只能移动一个土块 ③只能出现小土块在大木块之上 (2)递归求解的问题分解 ①将n-1个木块借助C柱由A移动到B柱. ②将最底层的唯一木块直接移动到C柱 ③将n-1个木块借助A柱由B柱移动到

剑指offer(27)字符串的排列

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 题目分析 这题还算可以,关于全排列,有两种解法,第一种就是递归全排列法,第二种就是回溯法. 递归全排列法: 就是剑指offer上的做法,也比较容易理解,不过挺少人答的也就是 把字符串分为两部分:第一部分为第一个字符,第二部分为第一个

数据结构开发(15):递归的思想与应用

0.目录 1.递归的思想 2.递归的应用 2.1 单向链表的转置 2.2 单向排序链表的合并 2.3 汉诺塔问题 2.4 全排列问题 2.5 逆序打印单链表中的偶数结点 2.6 八皇后问题 3.小结 1.递归的思想 递归是一种数学上分而自治的思想: 将原问题分解为规模较小的问题进行处理 分解后的问题与原问题的类型完全相同,但规模较小 通过小规模问题的解,能够轻易求得原问题的解 问题的分解是有限的 ( 递归不能无限进行 ) 当边界条件不满足时,分解问题 ( 递归继续进行 ) 当边界条件满足时,直接