Generate Parentheses

简介: Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()"   这道题其实是关于卡特兰数的,如果只是要输出结果有多少组,那么直接用卡特兰数的公式就可以。

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

"((()))", "(()())", "(())()", "()(())", "()()()"

 

这道题其实是关于卡特兰数的,如果只是要输出结果有多少组,那么直接用卡特兰数的公式就可以。关于卡特兰数,请参见卡特兰数-维基百科,里面有些常见的例子,这个概念还是比较重要的,因为很多问题的原型其实都是卡特兰数,大家可以看看。特别是其中

这个递推式的定义,很多这类问题都可以归结成这个表达式。这个题对于C的定义就是第一对括号中包含有几组括号。因为第一组括号中包含的括号对数量都不同,所以不会重复,接下来就是一个递归定义,里面又可以继续用更小的C去求组合可能性。
说完卡特兰数的内容,我们来看看这个具体问题怎么解决。一般来说是用递归的方法,因为可以归结为子问题去操作。在每次递归函数中记录左括号和右括号的剩余数量,然后有两种选择,一个是放一个左括号,另一种是放一个右括号。当然有一些否定条件,比如剩余的右括号不能比左括号少,或者左括号右括号数量都要大于0。正常结束条件是左右括号数量都为0。算法的复杂度是O(结果的数量),因为卡特兰数并不是一个多项式量级的数字,所以算法也不是多项式复杂度的。

 

C++实现代码:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        if(n==0)
            return vector<string>();
        vector<string> ret;
        string str;
        generate(n,n,ret,str);
        return ret;
    }
    void generate(int left,int right,vector<string> &ret,string &str)
    {
        if(left>right)
            return;
        if(left==0&&right==0)
        {
            ret.push_back(str);
            return;
        }
        if(left>0)
        {
            str.push_back('(');
            generate(left-1,right,ret,str);
            str.pop_back();
        }
        if(right>0)
        {
            str.push_back(')');
            generate(left,right-1,ret,str);
            str.pop_back();
        }
    }
};

int main()
{
    Solution s;
    vector<string> result=s.generateParenthesis(3);
    for(auto a:result)
        cout<<a<<endl;
}

 如果不传引用,就需要恢复,会更快一点:

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        if(n<=0)
            return vector<string>();
        vector<string> res;
        string path;
        generate(n,n,res,path);
        return res;
    }
    void generate(int left,int right,vector<string> &res,string path)
    {
        if(left>right)
            return;
        if(left==0&&right==0)
        {
            res.push_back(path);
            return;
        }
        if(left)
        {
            generate(left-1,right,res,path+'(');
        }
        if(right)
        {
            generate(left,right-1,res,path+')');
        }
    }
};

 

相关文章
|
消息中间件 资源调度 数据可视化
企业级分布式批处理方案
在企业级大数据量批处理需求场景中,如何通过分布式方式来有效地提升处理效率。本文将就常见批处理框架Spring Batch与SchdulerX进行比较讨论。同时基于阿里巴巴分布式任务调度平台SchedulerX2.0,实现一个分布式并行批处理方案,展示其相关的功能特性。
2617 0
水果软件flstudio设置成中文版本的操作步骤
再也用不着给编曲软件FL Studio安装汉化补丁了,今天FL Studio官方不声不响地悄悄更新了FL Studio 20中文版,但一些朋友装完Mac中文版后发现还是英文版,这是怎么回事呢?今天就俩讲一讲正确安装并设置FL中文版的方法。
2204 0
|
传感器 监控 安全
闭环反馈系统原理概述
有时,为了获得系统的一致性和稳定性并产生控制系统的期望输出,我们使用反馈回路。反馈只不过是输出信号的一部分。这个概念在控制系统中最常见和最重要,以实现输出的稳定性。根据反馈连接,控制系统分为两种类型。它们是开环控制系统和闭环控制系统。下面简单介绍下闭环反馈系统。
4157 0
闭环反馈系统原理概述
|
Web App开发 编解码 JavaScript
VUE播放RTSP方案,支持H.265!
VUE播放RTSP方案,支持H.265!如果你问一个前端技术人员,近几年最火的前端框架技术是什么,肯定会有人说VUE,确实VUE凭借其简单特性赢得了大家的喜爱,而近期公司有个项目,需要在VUE框架网页上播放RTSP实时视频。
1958 0
高德地图目前是哪个集团下的公司?
其实在2014年02月,阿里巴巴就斥资11亿美元,完成对高德地图的全资收购,所以高德地图目前是属于阿里巴巴集团下的公司了。
3366 0
|
自然语言处理 Python
Python 句法错误:"SyntaxError: invalid character in identifier",原因及解决方法
Python 句法错误:"SyntaxError: invalid character in identifier",原因及解决方法
7231 0
|
JSON 安全 数据安全/隐私保护
【Web】token机制
【Web】token机制
|
12月前
|
人工智能 运维 监控
智能化运维:AI在IT运维中的挑战与机遇###
本文探讨了人工智能(AI)技术在IT运维领域的应用,重点分析了AI如何提升运维效率、减少故障恢复时间,并预测未来发展趋势。通过具体案例展示了AI在实际运维中的应用效果,同时指出当前面临的挑战和解决方案,为读者提供一个全面了解智能化运维的视角。 ###
|
存储 缓存 编解码
阿里云服务器2核8G、4核16G、8核32G选择经济型、通用算力型和计算型实例参考
如果我们计划购买的云服务器配置是2核8G、4核16G、8核32G配置,在阿里云目前的活动中,可选的实例规格有经济型e、通用算力型u1、通用型g7、通用型g8y等几个实例规格可选,由于不同实例规格的性能和价格及适用场景不同,因此,有的新手用户可能不知道如何选择,本文为大家介绍在2核8G、4核16G、8核32G这三种配置下,经济型、通用算力型和通用型实例的选择问题,以供参考。
|
存储 Android开发
方法:一键把一堆手机号码一次性快速导入手机通讯录
手机是人们日常沟通常用的工具,所以自然就要用到手机里面的通讯录联系。因此我们常要把别人的号码存入到手机通讯录里面,如果只是存五个十个那就动动手指就可以了。但是如果你想存把一个电脑excel表格里面的几百个、几千个、几万个等数量级别的联系人一键导入手机通讯录,显然手动一个个来存入是不现实的。我这里演示,通过借助网上常见的便捷工具软件,金芝号码提取导入助手,代替你手动工作来快速完成这个工作,如何一键把一堆手机号码一次性快速导入手机通讯录,省事省时省力。下面做个操作过程的图文讲解。
4685 0
方法:一键把一堆手机号码一次性快速导入手机通讯录