申明:本文只用做自己学习记录
题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
代码
//假设n=2,则左括号left=2个,右括号right=2个,总数为[2,2]
//括号每多一个,则总数减少一个
//"(())"表示[0,0]:合法,"(()"表示[0,1]:合法,"())"表示[1,0]:不合法
//经过分析:只有当right>=left的情况下,括号组合才有效
//定义函数,实现排列组合
func generate(left int, right int, current string, result *[]string) {
//定义违规的边界条件1
if left < 0 || right < 0 {
return
}
//定义违规的边界条件2
if right < left {
return
}
//定义输出的临界条件
if left == 0 && right == 0 {
*result = append(*result, current)
return
}
//排除以上违规条件外,进行排列组合
//加左边括号
current = current + "("
//则左边括号总数-1,继续排列
generate(left-1, right, current, result)
//删除字符串最后一位,继续排列组合
current = current[:len(current)-1]
//加右边括号
current = current + ")"
//右边括号总数-1,继续排列
generate(left, right-1, current, result)
//删除字符串最后一位,继续排列组合
current = current[:len(current)-1]
}
func generateParenthesis(n int) []string {
//创建字符串切片
result := []string{}
//n==0表示无括号,不能排列组合
if n == 0 {
return result
}
//当n>0时进行排列组合
generate(n, n, "", &result)
return result
}