import java.util.*; public class Solution { /** * * @param n int整型 * @return string字符串ArrayList */ public ArrayList<String> generateParenthesis (int n) { ArrayList<String> res = new ArrayList<>() ; help(n , 0 , 0 , new StringBuilder() , res) ; return res ; } //思想:1.对于每一个位置,要么是左括号,要么是右括号,只有这么两种情况; //2.对于每一个位置上,我们可以尝试添加左括号,并记录左括号的使用次数;同理也可以添加右括号; //3.在某刻位置上若发现左括号已用完,但右括号还没用完,则说明当前已经不合法,终止递归; //4.合法的括号字符串拼接完成前,左括号的使用次数一定是大于右括号的,利用这个条件, //若在某个位置发现右括号的次数大于了左括号,或者是说右括号次数已经大于了括号对数,说明不合法, //终止递归。 //n对括号的排法(left是左括号的使用数量,right是有括号的使用数量) public void help(int n , int left , int right , StringBuilder sb , ArrayList<String> res) { if(left == n && right == n) {//当左右括号数量等于括号的对数,说明满足要求,保存结果 res.add(new String(sb)) ; return ; } //剪枝 if(left < n) {//只有左括号没用完的时候才添加左括号 help(n , left + 1 , right , sb.append("(") , res) ; sb.deleteCharAt(sb.length() - 1) ; } //剪枝 if(right < n && right < left) {//当又括号小于左括号,而且右括号没用完是才能添加右括号 help(n , left , right + 1 , sb.append(")") , res) ; sb.deleteCharAt(sb.length() - 1) ; } } }