Skip to content

Instantly share code, notes, and snippets.

@LostInKadath
Last active September 27, 2019 13:01
Show Gist options
  • Select an option

  • Save LostInKadath/415b37811d6aaa320e95f6784e28a4a5 to your computer and use it in GitHub Desktop.

Select an option

Save LostInKadath/415b37811d6aaa320e95f6784e28a4a5 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <string>
std::string Initialize(unsigned short number)
{
std::string sequence;
sequence.reserve(2 * number);
for (auto i = 0; i < number; ++i)
sequence += '(';
for (auto i = 0; i < number; ++i)
sequence += ')';
return sequence;
}
bool GenerateNext(std::string& sequence)
{
const auto size = sequence.size();
if (size % 2 != 0)
return false;
for (int i = size - 1, counter = 0; i >= 0; --i)
{
if (sequence[i] == ')')
++counter;
else if (sequence[i] == '(')
{
--counter;
if (counter <= 0)
continue;
// Найдена самая правая открывающая скобка - меняем ее на закрывающую с коррекцией счетчика
--counter;
sequence[i++] = ')';
/* Далее формируем лексикографически следующую последовательность.
* (size - i) - все скобки справа от текущей, включая текущую,
* counter - число незакрытых на данный момент закрывающих скобок справа от текущей.
* Тогда мы имеем P = (size - i - counter) пар скобок справа от текущей:
* P/2 открывающих и P/2 закрывающих.
*/
int open = (size - i - counter) / 2;
int close = size - i - open;
while (open--)
sequence[i++] = '(';
while (close--)
sequence[i++] = ')';
return true;
}
}
return false;
}
int main()
{
unsigned short number{ 0 };
std::cin >> number;
auto sequence = Initialize(number);
do
{
std::cout << sequence << '\n';
} while (GenerateNext(sequence));
system("pause");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment