在计算机科学领域,如何高效生成指定的序列是一个非常重要的问题。现在给你一个字符串,且这个字符串内部的字符已经升序有序。请你找出由这些字符构成的所有的序列。
输入
输入的第一行是一个整数n,表示测试数据组数。
接下来n行,每行输入一个字符升序有序的字符串。字符串中只包含小写字母,长度不超过8。
输出
对于每组输入,输出由输入的字符串中的字符构成的所有序列,按字典序升序排列,结果中不能出现相同的序列。
每组输出后面跟一个空行。
样例输入 Copy
3
ab
abc
bca
样例输出 Copy
ab
ba

abc
acb
bac
bca
cab
cba

abc
acb
bac
bca
cab
cba

next_permutation用法参考https://blog.csdn.net/ac_gibs...

//#include<iostream>
//#include<string>
//#include<string.h>
//#include<algorithm>
//#include<cstring>
//using namespace std;
//
//int main(){
//    int t = 0;
//    scanf("%d",&t);
//    while(t--){
//        string s;
//        cin >> s;
//        if(s.length() <= 8){
//            sort(s.begin(),s.end());
//            do//全排列 
//            {
//                cout<< s <<endl;
//            }while(next_permutation(s.begin(),s.end()));
//            cout << endl;
//        }        
//    }
//    return 0;
//}
////求字符循环流动的算法如下 
////void change(string &s) { //在while循环中会不停调用此函数不停变换短串s2
////    char t;
////    int i;
////    t = s[0];//用哨兵暂存储第一个字符
////    for(i = 0; i < s.length() - 1; i++) { //不要超界
////        s[i] = s[i + 1];//将后面的字符赋值给前面,不停完成轮换以检验变换后的多个s2......是否会在s1中出现
////    }
////    s[i] = t;//将哨兵中的字符赋值给字符串最后一个位置
////}
////排序方式可以为快速排序,这里写一遍快排(严蔚敏)
////void Quick_Sort(int a[], int low, int high){
////    if(low < high){
////        int pivot = Partiton(a, low, high);
////        Quick_Sort(a, low, pivot - 1);
////        Quick_Sort(a, pivot + 1, high);
////    }
////} 
////int Partiton(int a[], int low, int high){
////    int pivot  = a[low];
////    while(low < high){
////        while(low < high && a[high] >= pivot){
////            --high;
////        }
////        a[low] = a[high];
////        while(low < high && a[low] <= pivot){
////            ++low;
////        }
////        a[high] = a[low];
////    }
////    a[low] = pivot;
////    return low;
////}

另一种写法可供参考

//#include<iostream>
//#include<string>
//#include<string.h>
//#include<algorithm>
//#include<cstring>
//using namespace std;
//
//int main(){
//    int t = 0;
//    scanf("%d",&t);
//    char s[10];
//    while(t--){
//        scanf("%s",s);
//        int len = strlen(s);
//        if(len <= 8){
//            sort(s,s+len);
//            do//全排列 
//            {
//                printf("%s\n",s);
//            }while(next_permutation(s,s+len));
//            printf("\n");
//        }        
//    }
//    return 0;
//}


沐小轲
9 声望0 粉丝

C++初学者