22.括号生成
题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
题解
回溯法,定义一个集合,将括号依次加入,规则是:
当左括号未到最大个数可添加左括号或者右括号:((+"(“或”)"
右括号只在左括号个数大于右括号个数时添加: ( )( )接下来只能添加左括号
所以可以定义left,right两个标志,left小于所给n时可添加左括号,右括号只在right小于left时添加;代码如下
class Solution {
public List<String> generateParenthesis(int n) {
//定义集合l用来存放括号
List<String> l = new ArrayList();
backtrack(l, "", 0, 0, n);
return l;
}
public void backtrack(List<String> l, String kh, int left, int right, int max){
//当字符串长度等于两倍n,即括号对匹配时,将其加入集合后返回
if (kh.length() == max * 2) {
l.add(kh);
return;
}
//左括号数小于n时,可添加左括号,left标记加一递归
if (left < max){
backtrack(l, kh+"(", left+1, right, max);
}
//右括号数小于左括号数,可加入右括号,right标记加一递归
if (right < left){
backtrack(l, kh+")", left, right+1, max);
}
}
}