【递归穷举】括号生成

22. 括号生成

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

示例 1:

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

示例 2:

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


提示:

1 <= n <= 8


解题思路:

首先先不看边缘条件,如何做到穷举所有的情况——在放下第一个括号的时候,它的下一个可能是左括号,也可能是右括号,下下一个括号可能是左括号也可能是右括号……

于是整体的思路就出来了,用递归给每一层函数里都执行执行两次本函数,第一次传递左括号,第二次传递右括号。

边缘条件:通过分析可以看出左括号只要还有剩余,就可以添加,右括号只能剩余数量大于左括号剩余数量时才可以添加。于是原来设计的每一层函数都执行两次本函数变为有条件的执行,即,当左括号剩余不为0时,传递左括号;当右括号剩余大于左括号时,传递右括号。当左括号剩余等于右括号剩余等于0时,将结果保存;


class Solution {

public:

    void func(string str,int n1,int n2,vector<string> &res){

        if (n2==0) res.push_back(str);

        else{

            if (n1!=0){

                string t1=str+"(";

                func(t1,n1-1,n2,res);

            }

            if (n2>n1){

                string t2=str+")";

                func(t2,n1,n2-1,res);

            }

        }

    }

    vector<string> generateParenthesis(int n) {

        vector<string> res;

        func("(",n-1,n,res);

        return res;

    }

};

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ● 如何打印二叉树每层的节点? 考察点:二叉树 参考回答: 实现代码: import java.util.Arra...
    le_u阅读 3,505评论 0 0
  • CSS CSS3 布局属性 标签的权值为1,类选择符的权值为10,ID选择符的权值最高为100 !importan...
    53cfdb355418阅读 3,276评论 0 0
  • 前言 以前我看到面试贴就直接刷掉的,从不会多看一眼,直到去年 9 月份我开始准备面试时,才发现很多面试经验贴特别有...
    93ac81ebff1e阅读 1,352评论 0 0
  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 9,210评论 0 27
  • 《程序员代码面试指南-左程云》笔记 第一章 栈和队列 设计一个有getMin功能的栈 实现一个特殊的栈,在实现栈的...
    xiaogmail阅读 18,609评论 2 19