一个 n 括号序列由 n 个“(”s 和 n 个“)”s 组成。
一个有效的括号序列定义如下:
您可以找到一种方法来重复擦除相邻的一对括号“()”,直到它变空。
例如,"(())" 是一个有效的括号,你可以删除第 2 和第 3 个位置的对,它变成 "()",然后你可以把它留空。")()(" 不是一个有效的括号,在你擦除第 2 和第 3 位置的对后,它变成了 ")(" 并且你不能再擦除了。
现在,我们有了所有有效的 n 个括号序列。按字典顺序查找第 k 个最小的序列。
例如,以下是按字典顺序排列的所有有效的 3 个括号序列:
((()))
(()())
(())()
()(())
()()()
来源:https ://code.google.com/codejam/contest/4214486/dashboard#s=p3
注意:比赛现已结束,解决方案可供下载。
我已经通过使用 C++ STL 中可用的 next_permutation()解决了小输入( k < 10 6 )的问题。我无法为此制定一个子问题。我试图通过使用加泰罗尼亚语的号码来解决这个问题,但似乎没有取得任何成功。我不想看到解决方案,因为它对学习没有帮助。请帮助我确定一个子问题。