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

字符全排列

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

【题目描述】

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有‘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)

相关文章

亲和数

【题目描述】自然数a的因子是指能整除a的所有自然数,但不含a本身。例如12的因子为:1,2,3,4,6。若自然数a的因子之和为b,而且b的因子之和又等于a,则称a,b为一对“亲和数” 。求最小的一对亲...

【动态规划】完全背包

【题目描述】设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为m,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于m,而价值的和...

【题解】山区建小学

【题目描述】政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0<i<...

【题解】单词接龙

【题目描述】单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重...

【题解】BFS—迷宫问题(1)

【题解】BFS—迷宫问题(1)

【题目描述】一个5*5的矩阵,矩阵内用0,1显示。其中,0是路,表示这个点可以走,1是墙表示这个点不可以走。问,从给定的矩阵中从左上角到右下角最少需要走多少步?注:题目保证有解(不存在左上角和右下角为...

【题解】移动路线

【题目描述】X桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。小明是个调皮的孩子,一...