一个简单的问题 -全排列
全排列一共分为两种情况,有重复元素和无重复元素,大一开始做的时候不会写,现在特意写一下这个问题的各种解法。
1.无重复元素,这种相对简单一些,用递归就可以了
首先找到第一个字母,然后找到剩余的字母中的第一个字母,依次类推,很简单,代码如下:
//本来准备用dfs写,发现两个的复杂度是一样的,就没有必要了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[10],ans[10];
int n;
void dfs(int cur)
{
if(cur==n)
{
for(int i=0;i<n;i++)
putchar(ans[i]);
putchar('\n');
}
else
{
for(int i=0;i<n;i++)
{
bool ok=1;
for(int j=0;j<cur;j++)
if(ans[j]==str[i])
{
ok=0;
break;
}
if(ok)
{
ans[cur]=str[i];
dfs(cur+1);
}
}
}
}
int main()
{
while(~scanf("%s",str))
{
n=strlen(str);
sort(str,str+n);
dfs(0);
}
return 0;
}
2.现在介绍第二种,就是有重复元素的情况,例如abbc的排列
先介绍一种简单的方法,stl中提供了一个全排列的函数,下面介绍一下,
next_permutation是头文件algorithm中的一个函数,使用的时候必须引用这个头文件,下面是他的使用方法
next_permutation(str+s,str+e);str是一个字符数组,str+n,表示数组需要排列开始的地方,str+e表示数组排列结束的地方,他的含义是这个序列内的字符按照字典序的大小产生下一个序列,代码如下:
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() { char s[10],str[10]; cin>>s; strcpy(str,s); int len=strlen(s); do{ cout<<s<<endl; next_permutation(s,s+len); }while(strcmp(str,s)); return 0; }