1.什么是全排列
全排列顾名思义,就是对一系列的单个字符进行排列,所有的排列结果就称为全排列,
例如“1,2,3”,其全排列就有:“123”、“132”,“213“、”231“、312”,“321”,有6种,
可以发现其全排列的个数就是n!。
2.求解全排列的具体步骤
设 R = {r1,r2,r3 ...,rn }是要进行排列的n个元素, Ri = R - {ri} (表示不包括ri的其他所有元素)。
集合X中元素的全排列记为perm(X)。(ri)perm(x) 表示在全排列perm(X)的每一个排列前加上前缀ri得到的排列。
R的全排列可定义如下∶
当 n=1 时,perm(R)=(r),其中r是集合R中唯一的元素;
当 n>1 时,perm(R)由(ri)perm(R1), (r2)perm(R2),…,(ri)perm(Ri)构成。
3.案例(求123的全排列)
综上所述,在求解123的全排列时,可以得到如下过程(递归过程以深度优先遍历来观察):
#include <iostream>
#include <vector>
using namespace std;
void Perm(vector<int>& nums, int k, int m)
{
if (k == m)
{
for (int i = 0; i <= m; i++)
{
cout << nums[i];
}
cout << endl;
}
else
{
for (int j = k; j <= m; j++)
{
swap(nums[j], nums[k]);
Perm(nums, k + 1, m);
swap(nums[j], nums[k]);
}
}
}
int main()
{
vector<int> nums{ 1,2,3 };
int length = nums.size();
Perm(nums, 0, length - 1);
return 0;
}