给定一个n,要求生成一个合法的拥有n对括号的全排列
思路:
全排列问题常用回溯法求解,此题回溯时,边界条件是已生成序列长度为2n,因为最右边一定是右括号,所以等价于右括号×2
若剩下位置,并且已有左括号数小于n,我们给左括号,此次回溯到底则是左n个全为 “(”,
所以生成排列结果第一个的左n个一定都是 “(”
然后回溯,若左括号数大于右括号数,我们给一个右括号
所以第二个排列是左n-1个全为 ”(“, 第n个为 ‘)’,第n+1个为“)”
这种思想有点像树的中序遍历
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans=new ArrayList<>();
backtrack(ans,"",0,0,n);
return ans;
}
public void backtrack(List<String> ans,String c,int open,int close,int max){
if(close==max)
{
ans.add(c);
return;
}
if(open<max){
backtrack(ans,c+'(',open+1,close,max);
}
if(close<open)
{
backtrack(ans,c+')',open,close+1,max);
}
}
}