题目要求按顺序输出给定字符串所有字母的全排列。
总时间限制: 1000ms 内存限制: 65536kB
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'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
题目要求的输出顺序按从小到大排列,那么我们可以采用递归的方式,将待输出的字符串分为已排好部分和未排好部分,每次首先确定未排好部分的第一个字符,只要使得这个字符的给定顺序是由小到大即可。
#include <iostream>
#include <string>
using namespace std;
void fullArr(string head, string str) {
int i;
if (str.length() > 1) {
for (i = 0; i < str.length(); ++i) {
string rest = str;
rest.erase(rest.begin() + i);
fullArr(head + str[i], rest);
}
}
else {
cout << head << str << endl;
}
}
int main() {
string str;
cin >> str;
fullArr(string(""), str);
return 0;
}
2748.cpp 代码长度:389B 内存:172kB 时间:20ms 通过率:93% 最小内存:172kB 最短时间:0ms
我们可以每次把剩余的未分配的字符保存为一个字符串,每次在决定剩余字符串的第一个字符时,按从小到大顺序从剩余字符中依次选取一个放置到已排好字符串的末尾,再将剩余部分递归,当只剩下一个字符时,输出即可,可以采用string类型存储。
有任何的改进意见欢迎大家在微信平台公众号主页面留言或者发表issue。