全排列
描述
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
输入
输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在2到8之间。
输出
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S = s1s2…sk, T = t1t2…tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1= t1, s2= t2, …, sp - 1= tp - 1, sp< tp成立。
输入样例 1
abc
输出样例 1
abc
acb
bac
bca
cab
cba
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char s[10];
int length;
char temp[10];
bool isSelected(char m,int k)//m 在 temp 中是否有出现过
{
for(int i=0;i<k;i++)
{
if(temp[i]==m)//如果相等,表示之前k个已经取过m
return true;
}
return false;
}
void fullArrange(int k)//用temp 更好 。进行第k个全排列,从0开始
{
// 在s[]中选择,然后填入temp中
if(k==length)//All right! OUTPUT full arrange
{
for(int i=0;i<length;i++)
cout<<temp[i];
cout<<endl;
return;
}
//从s[0]到s[strlen[s]-1]的一个循环
// ~~如果n重循环,效率不行~~
// 然后是下一个字母的选择,不应该是选过的
//例如abcdefgh,加一个判断此字符是否选过的,遍历数组
//if(是没选过的) fullarrange(s,k+1), function -> isSelected()
for(int i=0;i<length;i++)
{
if(!isSelected(s[i],k))//字符s[i],前k-1个中找
{
temp[k]=s[i];
fullArrange(k+1);
}
}
}
int main()
{
scanf("%s",s);
length=strlen(s);
sort(s,s+length);//1.排序
//不提前赋值的话!!!!!此时length为 0!!!!!! 注意使用strlen() s无值居然不报错
fullArrange(0);//2.进入函数
return 0;
}