1. 回溯算法
剪枝条件
1) left > 0 时 可以加 "("
2) right > 0 && left < right 可以加 ")"
2. 动态规划
dp[i] 表示 n=i 时括号的组合
dp[i] = "(" + dp[j] + ")" + dp[i-j-1] j < i
实现
// 回溯funcgenerateParenthesis(n int)[]string{
ret :=make([]string,0)if n ==0{return ret
}
ret =generateParenthesisDfs("", n, n, ret)return ret
}funcgenerateParenthesisDfs(s string, left, right int, ret []string)[]string{if left ==0&& right ==0{
ret =append(ret, s)return ret
}println(fmt.Sprintf("s=%s, left=%d,right=%d,ret=%+v", s, left, right, ret))if left >0{
ret =generateParenthesisDfs(s +"(", left -1, right, ret)}if right >0&& left < right{
ret =generateParenthesisDfs(s +")", left, right -1, ret)}return ret
}// 动态规划funcgenerateParenthesis2(n int)[]string{
dp :=make([][]string,n +1)
dp[0]=make([]string,0)if n ==0{return dp[0]}
dp[0]=append(dp[0],"")for i :=1; i <= n; i++{
dp[i]=make([]string,0)for j :=0; j < i; j++{for_, s1 :=range dp[j]{for_, s2 :=range dp[i-j-1]{
s :="("+ s1 +")"+ s2
dp[i]=append(dp[i], s)}}}}return dp[n]}