算法训练营 训练 字谜(next_permutation函数)

题目描述

写程序从一组给定的字母中生成所有可能的单词。例如,给定单词“abc”,应该输出“abc”、“acb”、“bac”、“bca”、“cab”和“cba”。在输入的单词中,某些字母可能会出现多次。对于给定的单词,程序不应多次生成同一个单词,并且这些单词应按字母升序输出。

输入:输入由几个单词组成。第1行包含一个数字,表示单词数。以下每行各包含一个单词。单词由a到z的大小写字母组成。大小写字母应被视为不同。每个单词的长度都小于13。

输出:对于输入中的每个单词,输出应该包含所有可以用给定单词的字母生产的不同单词。由同一输入词生成的词应按字母升序输出。大写字母在对应的小写字母之前

算法设计

大写字母在相应小写字母之前,所需正确的字母顺序是A<a<B<b…<Z<z。需要自定义优先级函数,然后使用全排序next_permutation函数。

#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
int cmp(char a,char b);//优先级函数
int main() {
    string ch;
    int n;
    (cin >> n).get();
    while(n--){
        (cin >> ch).get();
        sort(ch.begin(),ch.end(),cmp);
        do{
            cout << ch <<endl;
        }while(next_permutation(ch.begin(),ch.end(),cmp));
    }
    cout << endl;
    return 0;
}
int cmp(char a,char b){
    if(tolower(a) != tolower(b)){//小写转换函数
        return tolower(a) < tolower(b);
    }
    else{
        return a < b;
    }
}

优先级定义函数中tolower()函数详解:
原型:int tolower(int c)
说明:如果c为小写英文字母,则返回对应的大写字母;否则返回原来的值。

输入:

3
aAb
abc
acba

输出:

Aab
Aba
aAb
abA
bAa
baA
abc
acb
bac
bca
cab
cba
aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa
上一篇:基本算法:排序


下一篇:全排列函数next_permutation函数