当前位置:首页 > 题解目录 > 正文内容

字符全排列

亿万年的星光5年前 (2021-01-28)题解目录2278

【题目描述】

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有‘a’ <‘b’ < … <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。

【输入描述】
只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

【输出描述】
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。

【样例输入】

abc

【样例输出】

abc
acb
bac
bca
cab
cba

【分析】

(1)比较经典的搜索回溯题目,不同的是由数字改成了字符
(2)定义一个输出函数,一旦满足要求就输出
(3)输入保证由小到大


【参考代码1】

/*
字符全排列
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[10],ans[10]; //用户输入的字符串,结果数组
int n;
bool flag[10]; //标记数组,用来标记这个字符有没有出现过
void dfs(int step)
{
   if(step==n) //如果步数到了n(长度),就输出ans
   {
       ans[step]='\0'; //加上结尾,防止过多输出
       cout<<ans<<endl;
   }
   for(int i=0;i<n;i++) //枚举字符,从0开始
       if(flag[i]==0) //如果当前的字符没有被使用过
       {
           flag[i]=1; //把当前字符标记为使用过
           ans[step]=str[i]; //把当前字符放到结果数组当中
           dfs(step+1); //搜索下一个位置
           flag[i]=0; //回溯一步
       }
}
int main()
{
   memset(flag,0,sizeof(flag)); //初始化标记数组
   scanf("%s",str); //读入字符串
   n=strlen(str); //测量字符串长度,用来判断是到头
   dfs(0); //注意,此处是从0开始的
   return 0;
}

另外一个框架的版本:

【参考代码2】

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char ans[10001];//存放答案的字符数组
int len; //字符数组长度
bool flag[10001]={0}; //标记这个数有没有被使用过,0表示没有使用
char s[50]; //要读入的数据
int dfs(int k)
{
   for(int i=0;i<len;i++) //字符数组从0开始枚举
   {
       if(flag[i]==0) //如果当前这个字符没有使用过
       {
           flag[i]=1; //当前字符使用过就标记
           ans[k]=s[i]; //把当前字符放到结果字符数组里
           if(k==len-1) //到达边界就输出
           {
               ans[len]='\0'; //在末尾加上结束标识符
               cout<<ans<<endl;
           }
           else
               dfs(k+1); //否则,就继续枚举下一个位置
           flag[i]=0; //回溯一步
       }
   }
}
                                   
int main()
{
 cin>>s;
 len=strlen(s);  
 dfs(0); //从第一个位置开始  
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:
返回列表

上一篇:连词成句

下一篇:字符全排列(2)

相关文章

【题解】选班委

【题目描述】小 T 和他的小伙伴们到 CZ 中学的创新实验班报到后的第一件事就是选班委,班主任 R 老师走上讲台宣布了选举办法,首先让全班 40 位同学依次上讲台做自我介绍,然后按照 职位一个一个依次...

生日

【题目描述】cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序。但cjf君最近作业很多,没有时间,所以请你帮她排序。【输入描述】有2行,第1行为OI组总人数n;第2行至第n+1行分别是每...

【题解】切割绳子

【题目描述】有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2位后的小数)。【输入描述】第一行两个整数N和K(0&l...

【题解】智力大冲浪

【题目描述】小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的。接下来主持人宣布了比赛规则:首...

【题解】计数2的N次方

【题目描述】任意给定一个正整数N(N≤100),计算2的n次方的值。【输入描述】输入一个正整数N。【输出描述】输出2的N次方的值。【样例输入】5【样例输出】32【参考答案】#include<io...

大象喝水

【题目描述】上课的时候老师问了小蒜蒜和同学们一个问题:一只大象口渴了,要喝 20 升水才能解渴,但现在只有一个深 h 厘米,底面半径为 r厘米的小圆桶...