1.題目
給定一個全由小寫字母構成的字符串,求它的全排列,按照字典序從小到大輸出。
輸入格式:
一行,一個字符串,長度不大于8。
輸出格式:
輸出所有全排列,每行一種排列形式,字典序從小到大。
輸入樣例:
在這里給出一組輸入。例如:
abc
輸出樣例:
在這里給出相應的輸出。例如:
abc
acb
bac
bca
cab
cba
2.算法原理
排序字符串: 使用 sort(s.begin(), s.end()) 將字符串按字典序排序。 這是必要的,因為next_permutation 需要從最小的排列開始生成。
生成全排列: 使用 do-while 循環和 next_permutation 生成所有排列。next_permutation(s.begin(), s.end()) 會修改字符串 s,生成下一個字典序排列。 當沒有下一個排列時,函數返回 false,循環結束。
代碼:
#include <iostream>
#include <algorithm> // 包含 next_permutation 和 sort
#include <string>int main() {std::string s;std::cin >> s; // 輸入字符串// 將字符串按字典序排序std::sort(s.begin(), s.end());// 輸出所有排列do {std::cout << s << std::endl;} while (next_permutation(s.begin(), s.end()));return 0;
}
擴展:模擬?nextPermutation 函數
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // 用于 std::reverseusing namespace std;bool nextPermutation(string& s) {int n = s.length();int i = n - 2;// 從后向前查找第一個 s[i] < s[i+1] 的位置while (i >= 0 && s[i] >= s[i + 1]) {i--;}// 如果找不到,說明已經是最大排列if (i < 0) {return false;}// 從后向前查找第一個 s[j] > s[i] 的位置int j = n - 1;while (j >= 0 && s[j] <= s[i]) {j--;}// 交換 s[i] 和 s[j]std::swap(s[i], s[j]);// 反轉 i+1 到末尾的部分std::reverse(s.begin() + i + 1, s.end());return true;
}int main() {string s;cin >> s; // 輸入字符串// 將字符串按字典序排序sort(s.begin(), s.end());// 輸出所有排列do {std::cout << s << std::endl;} while (nextPermutation(s));return 0;
}