题目:生成合法的括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。说明:解既不能包含重复的子集。
例如,给出 n = 3,生成结果为
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路
构建括号字符串就是只要 “(” 有剩,就可以选 “(”。 “(((((” 这么选,都还不能判定为非法。当 “)” 剩下的比 “(” 多时,才可以选 “)”,否则,“)” 不能选,选了就非法了。因此我们得出了两个约束条件:
1.只要“(” 的个数大于0就可以加入
2.只要"("的个数小于“)”的个数,我们就可以加入")",直到两者想等。
代码:
func generateParenthesis(n int) (arr []string) {
var dfs func(l,r int, path string)
dfs = func(l,r int, path string) {
if 2*n == len(path) {
arr = append(arr,path)
return
}
if l > 0 { //约束条件一
dfs(l-1,r,path+"(")
}
if r > l { //约束条件二
dfs(l,r-1,path+")")
}
}
dfs(n,n,"")
return
}