题目转变成"放n个左括号和n个右括号,放的过程中保证,左括号的数量始终大于等于右括号的数量,一共有多少种放法"
递归+回溯。
什么样的递归不用回溯?什么样的递归要回溯?
如果是拆分问题的递归,比如斐波那契数列,就不用回溯。
如果是暴力搜索思想的,比如找路径这种,就需要回溯,防止污染下一个搜索分支。
画了一颗递归树便于理解

java
class Solution {
public List<String> generateParenthesis(int n) {
LinkedList<String> ans= new LinkedList();
generate(ans,n,n,"");
return ans;
}
//left记录左括号剩下的,right记录右括号剩下的
public void generate(LinkedList<String> ans,int left, int right, String thisTurnResult){
if(left==0 && right ==0){
ans.add(thisTurnResult);
return;
}
//1、只能放左括号,需要回溯。这里通过传参的方式进行巧妙的回溯
if(left == right){
generate(ans,left-1,right,thisTurnResult+"(");
//2、左括号、右括号都能放
}else{
//一定是左括号先用完
if(left>0){
generate(ans,left-1,right,thisTurnResult+"(");
}
generate(ans,left,right-1,thisTurnResult+")");
}
}
}