回溯----5.括号生成

题目链接

/**

合法括号生成规则:

第一个括号必须是左括号(第一个为右必定无法闭合)

选择过程中左括号数量必须小于n才可选择左括号(大于n则一定有括号无法闭合)

左括号数量必须大于右括号数量才可选择右括号(相等代表所有前驱括号都已闭合)

所需参数:

left 记录已选择左括号数

right 记录已选择右括号数

限制条件:

由于括号必定从左括号开始的特性,左括号优先级高于右括号

left < n --> 避免左括号超量,导致无足够右括号与之闭合

left > right --> 括号未全部闭合,可选择右括号与之闭合

两条件共同保证括号生成合法性

*/

java 复制代码
class Solution {
    //保存结果集
    private List<String> res = new ArrayList<>();
    //保存单次结果
    private StringBuilder tempResult = new StringBuilder();

    private int n;

    public List<String> generateParenthesis(int n) {
        /**
            合法括号生成规则:
                            第一个括号必须是左括号(第一个为右必定无法闭合)
                            选择过程中左括号数量必须小于n才可选择左括号(大于n则一定有括号无法闭合)
                            左括号数量必须大于右括号数量才可选择右括号(相等代表所有前驱括号都已闭合)
            所需参数:
                            left 记录已选择左括号数
                            right 记录已选择右括号数
            限制条件:
                            由于括号必定从左括号开始的特性,左括号优先级高于右括号
                            left < n --> 避免左括号超量,导致无足够右括号与之闭合
                            left > right --> 括号未全部闭合,可选择右括号与之闭合
                            两条件共同保证括号生成合法性              
        */

        this.n = n;
        backtrack(0,0);

        return res;

    }

    private void backtrack(int left, int right) {
        //生成完毕,保存结果
        if(left + right == 2*n) {
            res.add(tempResult.toString());
            return;
        }

        //左括号未到上限可选择左括号
        if(left < n) { 
            tempResult.append("(");
            left++;
            backtrack(left,right);

            //回溯
            left--;
            tempResult.deleteCharAt(tempResult.length() - 1);
        }

        //左括号未全部与右括号匹配,可选择右括号
        if(left > right) {
            tempResult.append(")");
            right++;
            backtrack(left,right);

            //回溯
            right--;
            tempResult.deleteCharAt(tempResult.length() - 1);
        }
    }
}
相关推荐
SWAGGY..26 分钟前
【C++初阶】:(15)模板进阶--从非类型参数到模板特化与分离编译
java·服务器·前端
楠楠子呀1 小时前
独立站聊天转化全链路:从二维码引流到数据复盘
java·javascript·数据仓库·python·c#·自动化·etl
yurenpai(27届找实习中)1 小时前
从零读懂AI智能客服(二):Java 多模块项目如何协作:Maven 依赖、Spring 注入与运行时装配
java·spring·maven
有来技术1 小时前
youlai-boot 实战:MinIO 停止维护,Docker 迁移 RustFS 完整记录
java·后端·docker
吴声子夜歌1 小时前
Java面试——设计模式(二)
java·设计模式·面试
JAVA面经实录9171 小时前
MySQL问题定位与性能优化完整知识体系
java·jvm·数据库·mysql·性能优化
Rain的Java大神之路1 小时前
Docker搭建Redis集群完全指南
java·运维·redis·后端·docker·容器·架构
Raas1001 小时前
大模型网关和API网关区别是什么?MAI Gateway统一AI流量治理
java·大数据·运维·人工智能·gateway·企业级·ai网关
BioRunYiXue2 小时前
RACE技术全攻略:从全长克隆到靶基因验证
java·javascript·网络·人工智能·科技·算法·eclipse