https://www.acwing.com/problem/content/description/3432/
给定一个由不同的小写字母组成的字符串 s s s,输出这个字符串的所有全排列。我们假设对于小写字母有 a < b < … < y < z aa<b<…<y<z,而且给定的字符串中的字母已经按照从小到大的顺序排列。
输入格式:
输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在
1
1
1到
6
6
6之间。
输出格式:
输出这个字符串的所有排列方式,每行一个排列。
要求字母序比较小的排列在前面。
字母序如下定义:已知
S
=
s
1
s
2
…
s
k
,
T
=
t
1
t
2
…
t
k
S=s_1s_2…s_k,T=t_1t_2…t_k
S=s1s2…sk,T=t1t2…tk,则
S
<
T
S
数据范围:
字符串的长度在
1
1
1到
6
6
6之间。
可以DFS,依次枚举当前位置填哪个字母,每一层从小到大枚举所有字母。代码如下:
#include
using namespace std;
bool vis[7];
string s, t;
void dfs(int u) {
if (u == s.size()) cout << t << endl;
for (int i = 0; i < s.size(); i++) {
if (vis[i]) continue;
t[u] = s[i];
vis[i] = true;
dfs(u + 1);
vis[i] = false;
}
}
int main() {
cin >> s;
t.resize(s.size());
dfs(0);
}
时间复杂度 O ( n ! ) O(n!) O(n!), n n n为 s s s长度,空间 O ( n ) O(n) O(n)。