class Solution {
public List<String> resList = new ArrayList<>();
public List<String> generateParenthesis(int n) {
int left = n, right = n;
StringBuilder sb = new StringBuilder();
backTrace(left, right, sb);
return resList;
}
public void backTrace(int left, int right,StringBuilder sb){
//base
if(left>right){
return;
}
if(right==0 && left==0){
System.out.print("[left:"+left+",right:"+right+"]");
resList.add(sb.toString());
return;
}
if(left>0){
sb.append("(");
backTrace(--left,right,sb);
sb.deleteCharAt(sb.lastIndexOf("("));
left++;
}
if(right>0){
sb.append(")");
backTrace(left, --right, sb);
sb.deleteCharAt(sb.lastIndexOf(")"));
right++;
}
}
}
注意:如果通过回溯,希望某个传入的参数实现每次迭代都-1/+1时,如果使用:
(1)自增/自减方式:
那么请 将+/-号放在变量名前面:--left/++left
,这样才能有效增加,left++
等均无效
即:加完/减完再进入这个函数。
(2)直接-1/+1方式:
这里有个需要注意的方式,如果是递归类型,则需要考虑
backTrace(left-1)
仅在进入到下一个递归中时left的值为+1后的值,而递归结束回到当前递归时,left的值恢复到+1之前的left值。
总结:所以本题需要注意,如果采用的是left-1
,则不需要在撤销选择的时候left+1
,而如果使用的是--left
,则需要在撤销选择的时候++left
;
对于自增变量传入函数的理解:
如果left--
传入backTrace的第二个递归,
public void backTrace(left--){
方法体(left);
}
可以看作:
public void backTrace(left){
方法体(left);
left-1;
}
并且回到上一递归时,left的值依然是–之前的值,所以这样很可能出现StackOverFlow的异常。
开心,这个细节最近都有草蛇灰线,今天终于搞清楚了一点点,有理解不对的地方请指出~