本文已参与 ⌈新人创作礼⌋ 活动,一起开启掘金创作之路。
🏆今日学习目标: 🍀学习了解--1750:全排列 ✅创作者:贤鱼 ⏰预计时间:5分钟
@TOC
题目
-
描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。
-
输入 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。 输出 输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
-
已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得 s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。 样例输入
abc
样例输出
abc
acb
bac
bca
cab
cba
思路
一个递归函数 我们要求输入一个字符串,首先要求出字符串的长度
strlen好评
函数中我们就以字符串长度为边界条件,如果字符串长度大于输入的长度了,就结束程序,输出结果
如果还需要继续递归,我们就递归没有使用过的所有数据 题目就被解出来了
AC代码
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans,a[101086],youxi[10086];
char p[10086];
void s(int x){
if(x-1>=ans){
for(int i=1;i<=ans;i++) printf("%c",p[a[i]]);
cout<<endl;
return ;
}
for(int i=0;i<ans;i++){
if(youxi[i]!=0){
continue;
}
youxi[i]=1;//判断一手有没有使用过
a[x]=i;
s(x+1);
youxi[i]=0;//记得回溯的时候清零,不然影响后面程序运行
}
}
int main(){
cin>>p;
ans=strlen(p);
s(1);
}