ディクショナリシーケンスのアルゴリズム

1491 ワード

コードは次のとおりです.
class Solution
{
public:
	bool nextPermutation(vector<int>& nums)
	{
		int len = nums.size();
		if (len <= 1) return false;

		int i = len - 1;
		i--;

		while (1)
		{
			if (i < 0) return false;

			if (nums[i] < nums[i + 1])
			{
				int j = len - 1;
				while (!(nums[i] < nums[j])) j--;
				swap(nums[i], nums[j]);
				vector<int>::iterator it = nums.begin();
				advance(it, i + 1);
				reverse(it, nums.end());
				return true;
			}
			i--;
		}
	}
};
テストコードは次のとおりです.
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

class Solution
{
public:
	bool nextPermutation(vector<int>& nums)
	{
		int len = nums.size();
		if (len <= 1) return false;

		int i = len - 1;
		i--;

		while (1)
		{
			if (i < 0) return false;

			if (nums[i] < nums[i + 1])
			{
				int j = len - 1;
				while (!(nums[i] < nums[j])) j--;
				swap(nums[i], nums[j]);
				vector<int>::iterator it = nums.begin();
				advance(it, i + 1);
				reverse(it, nums.end());
				return true;
			}
			i--;
		}
	}
};

const int N = 5;

int main()
{
	Solution solver;
	vector<int> v;
	for (int i = 0; i < N; i++)
	{
		v.push_back(i + 1);
	}

	
	do {
		copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
		cout << endl;
	}while (solver.nextPermutation(v));
	return 0;
}