59.括号生成

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

示例1:

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

示例2:

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

提示:

  • 1 <= n <= 8

代码:

class Solution {
    public List<String> generateParenthesis(int n) {
        //res用于存储所有有效的括号组合
        List<String>res = new ArrayList<>();
        //s用于存储中间括号组合
        StringBuilder s = new StringBuilder();
        //递归寻找有效的括号组合
        dfs(0,n,n,res,s);
        //返回res
        return res;
    }
    //cnt表示左边未匹配的左括号数量,l表示还可以使用的左括号数量,r表示还可以使用的右括号数量
    public void dfs(int cnt,int l,int r,List<String>res,StringBuilder s){
        //如果左括号和右括号都使用完了
        if(l==0&&r==0){
            //将当前括号组合加入res中
            res.add(s.toString());
            //返回
            return;
        }
        //如果还有左括号可以使用
        if(l>0){
            //当前组合加入左括号
            s.append("(");
            //左边未匹配的左括号数量+1,还可以使用的左括号数量-1
            dfs(cnt+1,l-1,r,res,s);
            //回溯,移除左括号
            s.deleteCharAt(s.length()-1);
        }
        //如果还有右括号可以使用
        if(r>0&&cnt>0){
            //当前组合加入右括号
            s.append(")");
            //左边未匹配的左括号数量-1,还可以使用的右括号数量-1
            dfs(cnt-1,l,r-1,res,s);
            //回溯,移除右括号
            s.deleteCharAt(s.length()-1);
        }
    }
}
posted @ 2025-05-03 12:41  回忆、少年  阅读(10)  评论(0)    收藏  举报