题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
思路
1.这道题可以使用回溯算法求解。
2.我们需要三个变量记录当前执行状态,leftNum记录左括号的个数,rightNum记录右括号的个数,n记录括号的对数。
3.我们递归的思路就是,若左括号没达到上限则拼接左括号,否则拼接右括号;若字符串长度达成了标准(n*2),则表明这是一个解,将其加入集合后,进行回溯。
Java代码实现
public List<String> generateParenthesis(int n) { List<String> res = new ArrayList<>(); generateParenthesis(n,0,0,res,""); System.out.println(res); return res; } private void generateParenthesis(int n,int leftNum,int rightNum,List<String> res,String cur){ if(cur.length() == n*2){ res.add(cur); return; } if(leftNum < n) generateParenthesis(n,leftNum+1,rightNum,res,cur+"("); if(rightNum < leftNum) generateParenthesis(n,leftNum,rightNum+1,res,cur+")"); }
Golang代码实现
func generateParenthesis(n int) []string { res := make([]string,0) if n == 0 { return res } generateParenthesisBackTrace(n,0,0,"",&res) return res } func generateParenthesisBackTrace(n int,left int,right int,cur string,res *[]string) { if len(cur) == n*2{ *res = append(*res,cur) return } if left < n{ generateParenthesisBackTrace(n,left+1,right,cur+"(",res) } if right < left{ generateParenthesisBackTrace(n,left,right+1,cur+")",res) } }