UVA - 10098 - Generating Fast(全排列)

UVA - 10098 - Generating Fast(全排列)

Generating permutation has always been an important problem in computer science. In this problem you will have to generate the permutation of a given string in ascending order. Remember that your algorithm must be efficient.

Input

The first line of the input contains an integer n, which indicates how many strings to follow. The next n lines contain n strings. Strings will only contain alpha numerals and never contain any space. The maximum length of the string is 10.

Output

For each input string print all the permutations possible in ascending order. Not that the strings should be treated, as case sensitive strings and no permutation should be repeated. A blank line should follow each output set.

Sample Input

3
ab
abc
bca

Sample Output

ab
ba

abc
acb
bac
bca
cab
cba

abc
acb
bac
bca
cab
cba

题意:给出一串字符串,要求按字典序从小到大输出字符串的全排列

偷下懒,用 next_permutation 可以很好解决,具体操作过程是先将字符串中的所有字符按字典序排序,调用那个函数就好,下面总结一下 next_permutation的用法

next_permutation函数总结

int类型

int main()
{
    int a[3];
    a[0]=1; a[1]=2; a[2]=3;
    do{
        printf("%d%d%d\n", a[0], a[i], a[2]);
    }while (next_permutation(a,a+3));
    //如果存在a之后的排列,就返回true。如果a是最后一个排列没有后继,返回false,每执行一次,a就变成它的后继
}

输出:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

如果改成 while(next_permutation(a,a+2));
输出:

1 2 3
2 1 3

只对前两个元素进行字典排序

显然,如果改成 while(next_permutation(a,a+1)); 则只输出:1 2 3

若排列本来就是最大的了没有后继,则next_permutation执行后,会对排列进行字典升序排序,相当于循环

int list[3]={3,2,1};
next_permutation(list,list+3);
printf("%d %d %d\n", list[0], list[1], list[2]);

//输出: 1 2 3

char类型

int main()
{
    char str[205];
    scanf("%s", str);

    int len = strlen(str);
    sort(str, str+len);
    //该语句对输入的数组进行字典升序排序。如输入9874563102 puts(str); 将输出0123456789,这样就能输出全排列了

    do {
        puts(str);
    }while(next_permutation(str, str+len));

    return 0;
}

若采用 while(next_permutation(str, str+5)); 如果只输入1562,就会产生错误,因为str中第五个元素指向未知
若要整个字符串进行排序,参数5指的是数组的长度,不含结束符

string类型

int main()
{
    string line;
    while(cin>>line && line!="#")
    {
        if(next_permutation(line.begin(), line.end())) //从当前输入位置开始
            cout<<line<<endl;
        else    cout<<"Nosuccesor\n";
    }
}



int main()
{
    string line;
    while(cin>>line && line!="#")
    {
        sort(line.begin(), line.end());//全排列
        cout<<line<<endl;
        while(next_permutation(line.begin(), line.end()))
            cout<<line<<endl;
    }
}

以下是这道题的AC代码,用while 和 do-while 都OK,就是注意用while的时候记得把第一个输出来


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
    char str[15];
    int n;
    scanf("%d", &n);
    getchar();
    while(n--){
        gets(str);
        int len = strlen(str);
        sort(str, str+len);
        puts(str);
        while(next_permutation(str, str+len)){
            puts(str);
        }
        printf("\n");
    }
    return 0;   
}

你可能感兴趣的:(STL,全排列,uva)