算法第六节(第1部分: 全排列)

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

猜你喜欢

转载自blog.csdn.net/weixin_39804483/article/details/87814303