全排列(按字典序)

版权声明:转载请注明出处链接 https://blog.csdn.net/qq_43408238/article/details/89518764

描述

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'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

Code:
 

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <set>
#include<queue>
#include <map>
#include <iomanip>
#define  INF  0x3f3f3f3f
#define mmt(a,b)  memset(a,b,sizeof(a))
typedef long long ll;
const ll MAX=1000000;
using namespace std;
char c[10];
char s[10];
ll t;
bool vis[10];
void print()
{
    for(ll i=1;i<=t;++i)
    {
        cout<<s[i];
    }
    cout<<endl;
}
void dfs(ll step)
{
    if(step>t) return;
    for(ll i=1;i<=t;++i)
    {
        if(vis[i]) continue;
        vis[i]=1;
        s[step]=c[i];
        if(step==t) print();
        dfs(step+1);
        vis[i]=0;
    }

}
int main()
{
    cin>>(c+1);
    t=strlen(c+1);
    dfs(1);


}

第二种方法是STL里的全排函数——next_permutation()

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <set>
#include<queue>
#include <map>
#include <iomanip>
#define  INF  0x3f3f3f3f
#define mmt(a,b)  memset(a,b,sizeof(a))
typedef long long ll;
const ll MAX=1000000;
using namespace std;
char c[10];
char s[10];
ll t;
void print()
{
    for(ll i=1;i<=t;++i)
    {
        cout<<c[i];
    }
    cout<<endl;
}
int main()
{
    cin>>(c+1);
    t=strlen(c+1);
    sort(c+1,c+t+1);
    do
    {
        print();
    }while(next_permutation(c+1,c+t+1));


}

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/89518764