题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入: n = 1
输出: ["()"]
提示:
1 <= n <= 8
解题思路
- 合法的括号:对其任意前缀,左括号数>=右括号数
- 根据这个规则,我们可以dfs按位拼接字符串,直到长度2*n。合法的序列加入答案即可。复杂度O(2^2n)
func generateParenthesis(n int) []string {
ans := make([]string, 0)
s := make([]byte, n*2)
ans = getGenerateParenthesis(0, 0, n*2, s, ans)
return ans
}
func getGenerateParenthesis(l, r, n int, s []byte, ans []string) []string {
if l+r == n {
ans = append(ans, string(s))
return ans
}
if l < n/2 {
s[l+r] = '('
ans = getGenerateParenthesis(l+1, r, n, s, ans)
}
if r < l && r < n/2 {
s[l+r] = ')'
ans = getGenerateParenthesis(l, r+1, n, s, ans)
}
return ans
}