https://blog.csdn.net/csyifanZhang/article/details/105655354
↑为了更好地阅读体验
递归/stl两种实现方式详解
STL 全排列函数详解
头文件 #include <algorithm>
next_permutation
:求下一个排列组合
- 函数模板:next_permutation(arr, arr+size);
- 参数说明:
arr: 数组名
size:数组元素个数 - 函数功能: 返回值为bool类型,当当前序列不存在下一个排列时,函数返回false,否则返回true,排列好的数在数组中存储
- .注意:在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。比如,如果数组num初始化为2,3,1,那么输出就变为了:{2 3 1} {3 1 2} {3 2 1}
prev_permutation
:求上一个排列组合
- 函数模板:prev_permutation(arr, arr+size);
- 参数说明:
arr: 数组名
size:数组元素个数 - 函数功能: 返回值为bool类型,当当前序列不存在上一个排列时,函数返回false,否则返回true]
- 注意:在使用前需要对欲排列数组按降序排序,否则只能找出该序列之后的全排列数。
对string类型:
string s; while (getline(cin, s)) { sort(s.begin(), s.end()); do { cout << s << endl; } while (next_permutation(s.begin(), s.end())); cout << endl; }
对数组类型:
for (int i = 0; i < n; i++)cin >> a[i]; sort(a, a + n); do { for (int i = 0; i < n; i++)cout << a[i]; cout << endl; } while (next_permutation(a, a + n)); cout << endl;
递归求全排列
比如这里所说的全排列{"a","b","c","d"};
1。首先四个字母的全排列可以被简化成分别以"a"、"b"、"c"、"d"打头,加上剩下三个字母的全排列;
2。以此类推,上一步中的每一个三个字母的全排列,又可以被简化为分别以三个字母打头,加上剩下两个字母的全排列
3。重复前面的简化过程,直到只剩一个字母的时候,就很容易了处理了,因为一个字母的全排列太显而易见了
void pailie(string &str, int s, int t) { if (s == t) { cout << str << endl; return; } for (int i = s; i <= t; i++) { swap(str[s], str[i]); pailie(str, s + 1, t);//将str[s:t]的全排列转化为以s[i]开头 s[s+1:t]的全排列 swap(str[s], str[i]); } }