所以,我正在解决一个问题,该问题涉及对由开始和结束括号组成的适当字符串的给定序列进行排序。 n括号序列由n "("
s和n ")"
s组成。
有效的括号序列定义如下:
你可以找到一种方法来重复擦除相邻的括号"()"
,直到它变空。
例如,"(())"
是有效的括号,您可以在第2和第3个位置删除该对,它变为"()"
,然后您可以将其设为空。
")()("
不是有效的括号。现在,我想知道如何对给定长度的生成的括号序列进行排序,使得具有最大开括号的那些字符串开头,如果两个字符串在开头有相同数量的左括号,那么,在遍历两者时首先打印字符串,以第一个开口括号为准。例如,对于n=3
,排序的序列将为
((())) // 3 opening in a row and hence first
(()()) // 2 opening (same as the one which is below this one) but has a opening bracket first
(())()
()(())
()()()
答案 0 :(得分:5)
您可以使用标准排序算法std::sort
默认(词典编纂)顺序将达到您想要的效果。
答案 1 :(得分:1)
我可能会遗漏一些东西,但我认为直接排序会起作用。它有点像二进制数,除了'('
和')'
而不是1
和0
s。
#include <random>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
std::vector<std::string> tests =
{
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
};
int main()
{
std::shuffle(tests.begin(), tests.end(),
std::default_random_engine(std::random_device{}()));
std::cout << "\nbefore:\n";
for(auto const& s: tests)
std::cout << s << '\n';
// normal sort
std::sort(tests.begin(), tests.end());
std::cout << "\nafter:\n";
for(auto const& s: tests)
std::cout << s << '\n';
}
示例输出:
before:
(()())
(())()
()()()
((()))
()(())
after:
((()))
(()())
(())()
()(())
()()()