給定由不同小寫字母組成、已按字典序排序的字符串(長度 1~6),輸出其所有全排列,按字典序升序,每行一個。
因輸入已有序,按順序選擇未用字符即可自然生成字典序排列。
狀態:path 當前排列,used[i] 字符是否已用。
遞歸:
- 若 path.size() == n,輸出。
- 否則對 i=0..n-1,若未用,標記、加入、遞歸、回溯。
#include <bits/stdc++.h>
using namespace std;
string s;
bool used[7];
void dfs(string& path) {
if (path.size() == s.size()) {
cout << path << '\n';
return;
}
for (int i = 0; i < s.size(); ++i) {
if (!used[i]) {
used[i] = true;
path.push_back(s[i]);
dfs(path);
path.pop_back();
used[i] = false;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
while (cin >> s) {
fill(used, used + s.size(), false);
string path;
dfs(path);
cout << '\n'; // 每組樣例結束額外換行
}
return 0;
}
這是全排列生成的教科書級遞歸解法,簡潔高效,適用於小規模排列枚舉。