题目:

Generating permutation has always been an important problem in computer science. In this problem
you will have to generate the permutation of a given string in ascending order. Remember that your
algorithm must be efficient.
Input
The rst line of the input contains an integer n, which indicates how many strings to follow. The next
n lines contain n strings. Strings will only contain alpha numerals and never contain any space. The
maximum length of the string is 10.
Output
For each input string print all the permutations possible in ascending order. Not that the strings should
be treated, as case sensitive strings and no permutation should be repeated. A blank line should follow
each output set.
Sample Input
3
ab
abc
bca
Sample Output
ab
ba

abc
acb
bac
bca
cab
cba

abc
acb
bac
bca
cab
cba

题意:

输入字符串个数n,接下来依次输入n个字符串,要求按字典序从小到大输出每一个字符串的所有排列,不同字符串的全排列之间有一个空行。

分析:我在上一篇博客中写到了如何生成该字符串按字典序排列的下一个字符串--【https://www.cnblogs.com/cautx/p/11403927.html】

那么如何利用这个按字典序生成下一个排列的算法来生成全排列?

首先将该字符串按字典序从小到大排列:sort(s,s+len);

然后利用这个算法不断生成下一个排列并输出即可,只需要修改一下原算法的循环条件即可。

AC code1:

#include<bits/stdc++.h>
using namespace std;
char s[];
int len;
int solve()
{
int id=len-;
while(id>=)
{
if(s[id-]<s[id]) break;
else id--;
}
if(id==) return ;
int mpre=id-,mnow=id;
for(int j=mnow+;j<len;j++)
{
if(s[j]<=s[mpre]) continue;
if(s[j]<s[mnow]) mnow=j;
}
swap(s[mnow],s[mpre]);
sort(s+id,s+len);
return ;
}
int main()
{
//freopen("input.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
len=strlen(s);
sort(s,s+len);
printf("%s\n",s);
while(solve()) printf("%s\n",s);
printf("\n");
}
return ;
}

实际上,C++的STL的next_permutation(s,s+len)就是按照字典序来实现这个算法的。

AC code2:

#include<bits/stdc++.h>
using namespace std;
char s[];
int main()
{
//freopen("input.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
int len=strlen(s);
sort(s,s+len);
do{
printf("%s\n",s);
}while(next_permutation(s,s+len));
printf("\n");
}
return ;
}

UVA 10098 用字典序思想生成所有排列组合的更多相关文章

  1. POJ 1146 ID Codes 用字典序思想生成下一个排列组合

    ID Codes Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7644   Accepted: 4509 Descript ...

  2. [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)

    3193: [JLOI2013]地形生成 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 459  Solved: 223[Submit][Status ...

  3. [bzoj3193][JLOI2013]地形生成_排列组合_贪心

    [JLOI2013]地形生成 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3193 题解: 这种求总排列的题,一种常规做法就是所有的元素 ...

  4. uva 11174 Stand in a Line (排列组合)

    UVa Online Judge 训练指南的题目. 题意是,给出n个人,以及一些关系,要求对这n个人构成一个排列,其中父亲必须排在儿子的前面.问一共有多少种方式. 做法是,对于每一个父节点,将它的儿子 ...

  5. Day2:T3DP(基于排列组合思想)

    T3:DP(基于排列组合思想的状态转移) 其实之前写排列组合的题目有一种很茫然的感觉.... 应该是因为之前没有刷过所以没有什么体会 上次刷的vj1060有用到,但是写状态转移还是第一次学习吧 ccy ...

  6. 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  7. 【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  8. 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合

    给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...

  9. UVa Problem 10132 File Fragmentation (文件还原) 排列组合+暴力

    题目说每个相同文件(01串)都被撕裂成两部分,要求拼凑成原来的样子,如果有多种可能输出一种. 我标题写着排列组合,其实不是什么高深的数学题,只要把最长的那几个和最短的那几个凑一起,然后去用其他几个验证 ...

随机推荐

  1. c++小游戏——五子棋

    #include<iostream> #include<iomanip> #include<cstring> using namespace std; const ...

  2. iconfontのsymbol的使用

    iconfontのsymbol的使用 iconfont三种方式的优缺点 unicode 优点: 1.兼容性最好,支持ie6+ 2.支持按字体的方式去动态调整图标大小,颜色等等 缺点: 1.不支持多色图 ...

  3. 新手小白之学习python一飞冲天日志之—基本数据类型,条件控制语句

    python的历史 04年目前最流行的WEB框架Django诞生 python2:源码不统一,有重复的功能代码 python3:源码统一,没有重复的功能代码 python是一个什么编程语言 编译型:编 ...

  4. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

  5. Liunx环境下配置matplotlib库使用中文绘图

    最近在使用matplotlib库的过程中需要用到中文绘图,在网上找了好多种方法,最终用一种方法解决了,在此记录. 首先Linux是有自己的中文字体的,叫做"Droid Sans Fallba ...

  6. thinkphp 插件

    1.切换到项目根目录,使用composer require 5ini99/think-addons:dev-master命令安装thinkphp插件 如果是root用户或是管理员执行的话会有提示 等一 ...

  7. .net持续集成单元测试篇之单元测试简介以及在visual studio中配置Nunit使用环境

    系列目录 单元测试及测试驱动开发简介 什么是单元测试 单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验.单元测试几乎都是用单元测试框架编写的.单 ...

  8. 彻底理解kubernetes CNI

    kubernetes各版本离线安装包 CNI接口很简单,特别一些新手一定要克服恐惧心里,和我一探究竟,本文结合原理与实践,认真读下来一定会对原理理解非常透彻. 环境介绍 我们安装kubernetes时 ...

  9. mule发布调用webservice

    mule发布webservice 使用mule esb消息总线发布和调用webservice都非常精简,mule包装了所有操作,你只需要拖控件配置就可以,下面讲解mule发布: 1.下面是flow,h ...

  10. 为什么你要用 Spring?

    ​ 前言 现在Spring几乎成为了Java在企业级复杂应用开发的代名词,得益于Spring简单的设计哲学和其完善的生态圈,确实为廉颇老矣,尚能饭否的 Java 带来了“春天”,有很多同学刚接触Jav ...