**
题目描述:
**
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ]
**
解题思路:
**
比较简单的方法-递归吧
1.输入n之后说明现在有n个左括号和n个右括号可以填
2.最左面一定是左括号,最右面一定是右括号
3.考虑n-1个左右括号时有多少种排列
4.将最左或者最右加上括号
**
解题代码:
**
public static List<String> generateParenthesis(int n){
List<String> list = new ArrayList<String>();
int left = n;//记录左括号还剩余几个空余地方
int right = n;//记录右括号剩余几个地方
dfs(left, right,"",list);
return list;
}
private static void dfs(int left, int right, String s,List<String> list) {
if(left == 0 && right == 0){
list.add(s);
return;
}
if(left > 0){
dfs(left-1, right, s+"(",list);
}
if(left<right){
dfs(left, right-1, s+")",list);
}
}
个人收获:
递归是一种很常用的方法,但是他的执行顺序不容易自己设想出来,用程序debug查看或者手画几次执行步骤就很容易看出来啦