#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
using namespace std;
//
// test.h
// test
//
// Created by 吴珝君 on 2018/12/31.
// Copyright © 2018年 闲着也是贤者. All rights reserved.
//
/************************************************************************/
/************************************************************************/
/*
并查集的实现
*/
/************************************************************************/
//求字符串的全排列
// a b c
// 将1 放在 123位置
// 将 2放在 123 位置
class Permutation
{
//
public:
void permutation(vector<string> v)
{
proccess2(v, 0);
}
void swap(string & a, string & b)
{
string t = a;
a = b;
b = t;
}
void print(vector<string> v)
{
for (int i = 0; i < v.size() ; i++)
{
cout << v[i] << " ";
}
cout << endl;
}
void proccess1(vector<string> v, int i)
{
if (i == v.size())
{
print(v);
}
for (int j = i; j < v.size(); j++)
{
swap(v[i], v[j]);
proccess1(v, i + 1);
}
}
void proccess2(vector<string> v, int i)
{
if (i == v.size())
{
print(v);
}
//for (int i =0 ; i < v.size(); i++)
set<string> s;
for (int j = i; j < v.size(); j++)
{
// 先固定一个字符,然后将固定的字符与它后面的每一个进行交换,一直递归下去,直到固定的字符后面只有一个字符
if (s.count(v[j]) ==0)//如果有元素和前面的元素相同就不用交换
{
s.insert(v[j]);
swap(v[i], v[j]);
proccess2(v, i + 1);
}
}
}
};
//优先级队列
int main()
{
vector<string> v;
v.push_back("a");
v.push_back("a");
v.push_back("c");
Permutation p;
p.permutation(v);
system("pause");
return 0;
}