n个括号对的所有可能情况

所有可能情况的数量为卡特兰数。故求所有可能的出栈情况与此类似。

思路:

若左括号没全插入,则插入左括号;

若已插入左括号数比已插入右括号数多,则插入右括号;

 1 #include<stdio.h>
 2 void printParen(int l,int r,int n,char str[],int index)
 3 {
 4     if(l>n || r<0 || l<r)return;//已插入的右括号比左括号多,不合法括号对
 5
 6     if(l==n && r==n) printf("%s\n",str);
 7     else
 8     {//已插入的左括号不比已插入的右括号少
 9         if(l<n)
10         {//若左括号没插入完,继续插入左括号
11             str[index]=‘(‘;
12             printParen(l+1,r,n,str,index+1);
13         }
14         if(l>r)
15         {//若已插入的左括号比右括号多,插入右括号
16             str[index]=‘)‘;
17             printParen(l,r+1,n,str,index+1);
18         }
19     }
20 }
21 int main()
22 {
23     static int count=3;
24     char str[2*count+1];
25     str[2*count]=‘\0‘;
26     printParen(0,0,count,str,0);
27     return 0;
28 } 
时间: 2024-08-30 04:40:49

n个括号对的所有可能情况的相关文章

BZOJ2209: [Jsoi2011]括号序列

传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1}{2}+\frac{b+1}{2}$. 接着我们可以把'('变为1,把')'变为-1,然后每次取左区间的连续最小值,右区间的连续最大值,就是$a$与$b$的大小. 因为存在区间翻转,所以需要把左/右区间的连续最大/小值都搞出来. splay即可. //BZOJ2209 //by Cydiater

括号匹配-记错心得

数据结构课作业8--括号匹配时间限制: 1 Sec 内存限制: 128 MB提交: 278 解决: 113[提交][状态][讨论版]题目描述检查字符串中方括号.圆括号和花括号是否配对输入每个字符串一行,以0表示输入结束输出true 或者 false 每个一行样例输入(12,11,44,[6,[9]),(#)([#],([2],3,1}([#],([2],3,1),7)0样例输出falsefalsetrue 这是一道数据结构课后作业,看着蛮简单的,思路也挺清晰,首先明确错误例子有这些: 1.][

【51NOD 1478】括号序列的最长合法子段

很恶心啊,一道水题改了半天,主要是各种细节没有注意到,包括左括号剩余时有可能会出错的情况,需要从后往前扫 贡献一组测试数据: ((()))())(())(( 答案:8 1 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1E6 + 3; char s[N]; int main() { scanf("%s", s); in

Bracket Sequences Concatenation Problem CodeForces - 990C(括号匹配水题)

明确一下  一个字符串有x左括号不匹配  和 另一个字符串有x个右括号不匹配  这俩是一定能够匹配的 脑子有点迷 emm... 所以统计就好了  统计x个左括号的有几个,x个右括号的有几个 然后 乘一下 如果一个串 同时存在左右括号都不匹配的情况 则忽略 因为这个串需要另外两个括号去匹配 不要忘了处理左右括号已经匹配的情况 #include <bits/stdc++.h> using namespace std; const int maxn = 1e6+5, INF = 0x7fffffff

括号匹配_进阶篇 ( 7-2 符号配对 )

括号匹配_进阶篇(/.../) 之前有个简单的括号匹配,令这三对括号进行匹配:( ),[ ],{ } 点击跳转:简单的括号匹配问题 之所以说他们简单,是因为每个括号都只占一个字符. 而进阶篇,虽然说起来很酷,其实就是再多一个对/* */的判断 先上原题 7-2 符号配对 (20 分) 请编写程序检查C语言源程序中下列符号是否配对:/*与*/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束.程序中需要检查配对的符号不超过1

LeetCode刷题--有效的括号(简单)

题目描述 给定一个只包括 ' ( ' , ' )  ',  ' { ' , ' } ' , ' [ ' , ' ] ' 的字符串,判断字符串是否有效.有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认为是有效字符串. 示例1: 输入:"()"输出:true 示例2: 输入:"()[ ] { } "输出:true 示例3: 输入:"( ] "输出:false 示例4: 输入:"( [

LeetCode 678. Valid Parenthesis String 有效的括号字符串 (C++/Java)

题目: Given a string containing only three types of characters: '(', ')' and '*', write a function to check whether this string is valid. We define the validity of a string by these rules: Any left parenthesis '(' must have a corresponding right parent

数据结构Java实现05----栈:顺序栈和链式堆栈

数据结构Java实现05----栈:顺序栈和链式堆栈 一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适

Java 线程的状态

Java Thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等 BLOCKED  这个状态下, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchro