数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。
解题思路:
有效的括号组合实际上就是任意一个右括号左边都有一个左括号和它相匹配。可以想象成一个指针从下标为0的位置开始遍历数组,遇到左括号让变量left加1;遇到右括号让变量right加1,若中途出现right>left的情况,就代表这不是一个有效的括号组合。
结合以上想法,运用回溯方法,从左到右依次给目标字符串增加括号,并考虑每个位置是左括号和右括号时,left和right的情况,以此来判断是否要剪枝。
代码如下:
List<String> res=new ArrayList<>();
int left=0;
int right=0;
StringBuilder temp=new StringBuilder();
public List<String> generateParenthesis(int n) {
getRes(n);
return res;
}
//每个位置先放入左括号,再放入右括号
private void getRes(int n) {
if(left+right==n+n){
res.add(new String(temp));
}
if(left<n){//此时可以放入左括号
left++;
temp.append("(");
getRes(n);
temp.deleteCharAt(temp.length()-1);
left--;
}
if(left>right){//此时可以放入右括号
right++;
temp.append(")");
getRes(n);
temp.deleteCharAt(temp.length()-1);
right--;
}
}