数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合
    示例 1:
    输入:n = 3
    输出:[“((()))”,”(()())”,”(())()”,”()(())”,”()()()”]
    提示:
    1 <= n <= 8

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/generate-parentheses

    思路
    在进行生成的时候可以知道,left一定要比right小。因为大就证明无法满足条件,左边比右边还多无法生成正确的。
    进行回溯法。结束条件就是left==0 && right==0

    1. if(left==0&&rigth==0){
    2. res.add(str);
    3. return;
    4. }
    1. 然后进行满足条件的括号匹配
    1. if(left==rigth){
    2. // 左右相等的时候只能左括号先加入。保证left不能大于right
    3. getParenthesis(str+"(",left-1,rigth);
    4. }else if(left<rigth){ //条件可以去掉,因为left会小于right
    5. // 两种可能 左边先或者右边都可以
    6. if(left>0){
    7. getParenthesis(str+"(",left-1,rigth);
    8. }
    9. getParenthesis(str+")",left,rigth-1);
    10. }

    代码

    1. class Solution {
    2. List<String> res = new ArrayList<>();
    3. public List<String> generateParenthesis(int n) {
    4. if(n<=0) return res;
    5. getParenthesis("",n,n);
    6. return res;
    7. }
    8. void getParenthesis(String str,int left,int rigth){
    9. if(left==0&&rigth==0){
    10. res.add(str);
    11. return;
    12. }
    13. if(left==rigth){
    14. // 左右相等的时候只能左括号先加入
    15. getParenthesis(str+"(",left-1,rigth);
    16. }else if(left<rigth){
    17. // 两种可能 左边先或者右边都可以
    18. if(left>0){
    19. getParenthesis(str+"(",left-1,rigth);
    20. }
    21. getParenthesis(str+")",left,rigth-1);
    22. }
    23. }
    24. }