正确的括号顺序 (RSP)


常规括号序列由一种或多种类型的左括号和右括号组成,每个左括号都有一个右括号,并且(在多种类型的情况下)它们的类型不重叠。
正确的SP: 
( ( ) ) ( ) ( ) 
{ } [ ( ) ] ( ) 
{ [ ( { } ) ] } 
无效SP: 
) ) ( ( ) ) ( ( 
{ [ ( ] ) } 
( ( ] } 
 
要检查一个括号序列是否为同一类型,只需检查平衡即可。
也就是说,我们开始一个等于零的变量(balance)。然后我们遍历字符串(如果你不知道该怎么做 - 运行,愚蠢!),当它遇到左括号时增加余额并在遇到右括号时减少它。如果在任何阶段余额变为负数或在最后不等于零,则序列是错误的。 

在存在多种类型的括号的情况下,一切都会变得更加复杂。我们创建一个堆栈来充当该平衡变量。这是必要的,因为括号不能重叠。当我们遍历一行并遇到左括号时,我们将其压入堆栈。当我们遇到右大括号时,我们会尝试从堆栈中弹出该类型的左大括号。如果堆栈上有不同类型的花括号,则序列无效。如果最后栈非空,序列也无效。 

正确的括号序列的生成直接来自检查完成的方式——我们只需要添加新的括号而不违反正确性。这是通过递归迭代完成的。如果你不认识他——是……啊,不,你可以通过进一步阅读来尝试理解。下面是一种括号的代码示例:
 
#include 
#include 

使用 命名空间 std;
int n; //半长
矢量<字符>答; // 我们的答案

void rec(int 余额) {
if (ans.size() == 2 * n) { // 如果是,那么我们完成了
for (int i = 0; i < 2 * n; i++)
输出 <<回答[我] << ” ";
输出 << "\n";
}
if (ans.size() + balance + 2 <= n * 2) { // 检查,我们''ll make it do we clos the new opening brace 
// 注意你的手:我们不需要为每个序列制作一个单独的向量
ans.push_back('(');
记录(余额+ 1);
ans.pop_back(); // 要理解这一点,你需要了解递归。首先,我们向向量添加一个括号,然后再次执行所有这些代码。 
// 也就是再加一个括号,如果可以的话。 
// 这种情况会发生,直到我们开始离开递归——也就是说,直到我们达到所需的长度。 
// 然后开始去掉括号。如果你明白这一点——恭喜你,你真棒。 
}
if (balance > 0) { // 如果我们可以关闭一个括号,我们就关闭它。 
ans.push_back(')');
记录(余额 - 1);
ans.pop_back();
}
}

 int main()
{
辛>>名词;
记录(0);

    返回 0;
}
现在是困难时期 - 您将不得不自己编写几种类型的括号的算法!哈哈哈哈哈哈哈哈哈!