第一种的“全排列”是按照题目的字母序,等价于对全排列进行字母序排列
【题目描述】
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有‘a’ <‘b’ < … <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。
【输入】
只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
【输出】
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S=s1s2…sk,T=t1t2…tkS=s1s2…sk,T=t1t2…tk,则S<T等价于,存在p(1≤p≤k),使得s1=t1,s2=t2,…,sp−1=tp−1,sp<tps1=t1,s2=t2,…,sp−1=tp−1,sp<tp成立。
【输入样例】
abc
【输出样例】
abc
acb
bac
bca
cab
cba
代码
#include<iostream>
#include<string>
using namespace std;
char s[26], t[26];//第一个字符串是用来用户输入//第二个t是储存排完序之后的字符串;
//这里要说一下 为啥不定义string s, t;;因为用了string之后strlen()只能求字符数组的长度,不能求串的长。
//其次如果你如果把求长度的这部分改成s.size();系统仍然不能运行 具体不知为啥。
//综上所述改用 字符数组!
bool p[26];//现在定义的话这个数组p全都是0;
int n;//用来记录串的长度;
void f(int d)
{
if (d == n)
{
t[d] = '\0';//结束符\0;
cout << t << endl;
}
for (int i = 0; i < n; i++)
if (p[i] == 0)
{
p[i] = 1;
t[d] = s[i];
f(d + 1);
p[i] = 0;
}
}//这个递归函数完成的就是把t[0]=s[0],t[1]=s[1],t[2]=s[2].........
//t[0]=s[1],t[1]=s[0],.......
//之后依次来弄
int main()
{
cin >> s;
n = strlen(s);
f(0);
}
解释一下上边的代码为啥用string s,t;不对呢 原因是 s你给了初值而t没有初值,在主函数外边定义 默认字节为0 所以 对t进行的t [ i ]的操作都是错误的,只需要给它开辟空间 即赋值之后就可以了
#include<iostream>
#include<string>
using namespace std;
//char s[26], t[26];//第一个字符串是用来用户输入//第二个t是储存排完序之后的字符串;
//这里要说一下 为啥不定义string s, t;;因为用了string之后strlen()只能求字符数组的长度,不能求串的长。
//其次如果你如果把求长度的这部分改成s.size();系统仍然不能运行 具体不知为啥。
//综上所述改用 字符数组!
string s, t;
bool p[26];//现在定义的话这个数组p全都是0;
int n;//用来记录串的长度;
void f(int d)
{
if (d == n)
{
//t[d] = '\0';//结束符\0;
cout << t << endl;
}
for (int i = 0; i < n; i++)
if (p[i] == 0)
{
p[i] = 1;
t[d] = s[i];
f(d + 1);
p[i] = 0;
}
}//这个递归函数完成的就是把t[0]=s[0],t[1]=s[1],t[2]=s[2].........
//t[0]=s[1],t[1]=s[0],.......
//之后依次来弄
int main()
{
cin >> s; t = s;
n = s.size();
f(0);
}
还有一种全排列就是简单地排全排列
#include<iostream>
#include<cstring>
using namespace std;
void f(char a[], int k, int m)
{
if (k == m)
{
for (int i = 0; i <= m; i++)
cout << a[i]; cout << endl;
}
else
for (int i = k; i <= m; i++)
{
swap(a[i], a[k]);
f(a, k + 1, m);
swap(a[i], a[k]);
}
}
int main()
{
string b; cin >> b; char a[27];
int m = b.size() - 1;
for (int i = 0; i <= m; i++)
a[i] = b[i];
f(a, 0, m);
}