全排列的两种 (有点模糊的)!!!

第一种的“全排列”是按照题目的字母序,等价于对全排列进行字母序排列

【题目描述】
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。

我们假设对于小写字母有‘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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值