前置知识:如何判断一个括号序列合法?
考虑将( 视作 1 , ) 视作 -1 ,这样一对括号的匹配可以被视作1-1 = 0
那么满足以下两个条件,这个括号序列就是合法的:
1.整体角度:整个序列的总和需要是0 ,不然就代表左右括号个数不一致,这样不管内部实际是什么顺序,都不可能匹配的。
2.从左往右累加cnt 的过程中,任意时刻需要满足cnt >= 0 。 因为如果cnt < 0 就代表此刻前缀中右括号多于左括号,那不管后续括号是什么状态,这个多出来的右括号都不可能得到匹配了。
给定整数 n,表示可用的圆括号对数。每一对括号由一个左括号 '(' 和一个右括号 ')' 组成。请枚举所有由恰好 n 对括号构成的字符串,并且每个字符串都必须是有效的括号组合。
一个字符串被称为有效的括号组合,当且仅当从左到右扫描时,在任意位置已经出现的左括号数量都不少于右括号数量,并且扫描结束后左括号和右括号的总数量相等。
约束条件:n 的取值范围为 1≤n≤8。
输入包含一个参数:
n:一个整数,代表可用的括号对数返回一个字符串数组,包含所有可能的有效括号。
输入
2
输出
(())
()()
说明
输入为 2 时,共有 2 对括号,需要生成长度为 4 的有效字符串。
第一种组合 (()) 是外层括号包含内层括号;第二种组合 ()() 是两个括号对依次排列。两种组合从左到右扫描时,任意前缀中左括号数量都不少于右括号数量,因此符合要求。
输入
4
输出
(((())))
((()()))
((())())
((()))()
(()(()))
(()()())
(()())()
(())(())
(())()()
()((()))
()(()())
()(())()
()()(())
()()()()
说明
输入为 4 时,共有 4 对括号,总长度为 2×4=8。此时有效括号组合的数量为 Catalan 数 C4=14,因此输出共有 14 行。
输出按字典序逐行给出。例如 (((()))) 表示四层括号全部嵌套,()()()() 表示四个括号对依次排列。所有输出均满足任意前缀中左括号数量不少于右括号数量。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册