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;
}