题目描述
写程序从一组给定的字母中生成所有可能的单词。例如,给定单词“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