题目:括号生成(力扣22)
题目描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解题思路:
只有在我们知道序列仍然保持有效时才添加 ‘(’ or ‘)’。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。
代码实现:
class Solution {
public List<String> generateParenthesis(int n) {
//记录所有有效的结果
List<String> list=new ArrayList<>();
//代码的鲁棒性
if(n==0) {
return list;
}
//左右括号的个数使用过的个数分别为0
//用res 来表示生成的结果字符串
String res="";
helper(list,0,0,n,res);
return list;
}
private void helper(List<String> list, int left, int right, int n, String res) {
//左右括号都等于n时,括号生成完毕,添加到结果集合list中
if(left==n && right==n) {
list.add(res);
return;
}
//先放左括号
if(left<n) {
helper(list,left+1,right,n,res+"(");
}
//右括号前面有左括号,且右括号的个数还没有用光
if(left>right && right<n) {
helper(list,left,right+1,n,res+")");
}
}
}