17 分类: Leetcode,算法

22.括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

**输入:** n = 3
**输出:** ["((()))","(()())","(())()","()(())","()()()"]

示例 2:

**输入:** n = 1
**输出:** ["()"]

提示:

  • 1 <= n <= 8

思路:当左右括号全部用完时结束递归

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> ans=new ArrayList<>();
        backtrace(ans,n,n,"");
        return ans;
    }

    //注意结束逻辑,需要把所有情况统计到
    public void backtrace(List<String> ans,int left,int right,String str){
        //如果右括号用的多,则直接返回
        if(left>right||left<0)
            return;
        if(left==0&&right==0){
            ans.add(str);
            return;
        }
        //str起始为空,先添加左括号,再添加右括号
        backtrace(ans,left-1,right,str+"(");
        backtrace(ans,left,right-1,str+")");
    }
}

思路二

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<String>();
        backtrack(ans, new StringBuilder(), 0, 0, n);
        return ans;
    }

    public void backtrack(List<String> ans, StringBuilder cur, int open, int close, int max) {
        if (cur.length() == max * 2) {
            ans.add(cur.toString());
            return;
        }
        if (open < max) {
            cur.append('(');
            backtrack(ans, cur, open + 1, close, max);
            //注意保持本层组成的字符串不变
            cur.deleteCharAt(cur.length() - 1);
        }
        //只有当左括号数量小于右括号数量时,添加右括号
        if (close < open) {
            cur.append(')');
            backtrack(ans, cur, open, close + 1, max);
            cur.deleteCharAt(cur.length() - 1);
        }
    }
}

#none

作者: zyk的zone

版权: 除特别声明,均采用BY-NC-SA 4.0许可协议,转载请表明出处

目录Content

-->