组合的问题往往用DFS搜索,关键是如何组合能满足合法括号的条件,可以用图来进行思考:以n=3为例
A:由于n=3,只能有3个左括号,3个右括号,已经有了3个左括号,不能再放左括号了,故只能再往右侧走,得到((()))
B:同上,(()(已经有3个左括号了,只能再放右括号,往C走,得到(()())
D:(())(已有3个左括号了,只能放右括号,得到(())()
继续往后,可以得到剩余的组合
推到这里,也可以看出基本的思路:左括号次数为l,有括号次数为r,当l==n时左括号用完了,再往后增加n-r个右括号就得到了一个括号组合;若左括号没用完,则放左括号;只有当l>r时才可以放右括号,转换为代码如下:
class S