22.括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ " ( ( ( ) ) ) " , " ( ( ) ( ) ) " , " ( ( ) ) ( ) " , " ( ) ( ( ) ) " , " ( ) ( ) ( ) " ] [ "((()))", "(()())", "(())()", "()(())", "()()()" ] ["((()))","(()())","(())()","()(())","()()()"]
解题思路
回溯法:
- 记录左括号和右括号的数目,对每一个位置是左括号还是右括号进行枚举
- 在左括号数量大于右括号数量时才可以给该位置添加右括号
- 不然添加左括号
Code(Java)
class Solution {
private List<String> list = new ArrayList<>();
private int n;
public List<String> generateParenthesis(int n) {
this.n = n;
packbrack(new char[2 * n], 0, 0, 0);
return list;
}
private void packbrack(char[] s, int i, int lnum, int rnum) {
if (lnum == n && rnum == n) {
list.add(new String(s));
return;
}
if(i<2*n){
s[i] = '(';
packbrack(s, i + 1, lnum + 1, rnum);
if (lnum > rnum) {
s[i] = ')';
packbrack(s, i + 1, lnum, rnum + 1);
}
}
}
}