package leecode;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
 * 22. 括号生成
 *
 * 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
 *
 * 有效括号组合需满足:左括号必须以正确的顺序闭合。
 *
 * @author Tang
 * @date 2021/9/22
 */
public class GenerateParenthesis {
    List<String> resultList = new ArrayList<>();
    int num;
    /**
     * 二叉树
     * 前序遍历 根左右
     *
     *
     * @param n
     * @return
     */
    public List<String> generateParenthesis(int n) {
        num = n;
        //括号总个数
        generator("", "(", 0, 0);
        return resultList;
    }
    /**
     *
     * @param str 拼接的字符串
     * @param append 下次要添加的括号
     * @param left  左括号数量
     * @param right 右括号数量
     */
    private void generator(String str, String append, int left, int right) {
        String line = str;
        //保证左括号数量始终大于等于右括号数量
        if(left == right && ")".equals(append)) {
            return;
        }
        if("(".equals(append)) {
            left++;
        }else {
            right++;
        }
        line += append;
        //凑齐括号 召唤神龙
        if(left + right == num * 2) {
            resultList.add(line);
            return;
        }
        if(left < num) {
            generator(line, "(", left, right);
        }
        if(right < num) {
            generator(line, ")", left, right);
        }
    }
    public static void main(String[] args) {
        System.out.println(new GenerateParenthesis().generateParenthesis(3));
    }
}