前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-22-括号生成

leetcode-22-括号生成

作者头像
chenjx85
发布2018-08-16 11:26:41
4910
发布2018-08-16 11:26:41
举报

题目描述:

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 = 3,生成结果为:

代码语言:javascript
复制
[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

要完成的函数:

vector<string> generateParenthesis(int n) 

说明:

1、给定一个整数n,有n对括号,要用这n对括号排列成 尽可能多 且 合理 的序列,最后返回所有的序列。

序列以字符串的格式存储,所有序列存放在vector中。

2、这道题初看很熟悉,似乎又是常见的括号匹配题…但实际上是深度优先读取二叉树的题目…

我们人在做这种题时,都是想,最开始第一个符号肯定是左括号 ( ,接着可以是左括号 ( 形成 (( ,也可以是右括号 ) 形成 () ,

再接着可以是左括号 (((,也可以是右括号 (() ,也可以是左括号 ()( ……

但对于计算机来说,这种方法的实现要复制当前情况,接着再填入两种或一种可能,再复制当前情况,再填入……

相当麻烦的一种做法。

我们换个角度来想,其实我们刚刚的做法是在建树,不断地生成新的分叉,所以其实我们可以用读取树的方法来做这道题。

我们肯定是要深度优先读取的,所以采用递归是最方便的。

代码如下:(附详解)

代码语言:javascript
复制
    vector<string>res;//定义最终要返回的全局变量
    void digui(string res1,int left,int right)
    {
        if(left==0&&right==0)//最终的退出条件
        {
            res.push_back(res1);//把当前得到的字符串插入到res中
            return;
        }
        if(left>0)//如果还有左括号
            digui(res1+'(',left-1,right);//当前字符串加上左括号,左括号个数-1进入递归
        if(right>left)//如果当前剩余右括号个数大于左括号
            digui(res1+')',left,right-1);//当前字符串加上右括号,右括号个数-1进入递归
    }
    vector<string> generateParenthesis(int n)
    {
        string res1="";
        int left=n,right=n;//表示当前还有n个左括号,n个右括号
        digui(res1,left,right);//进入递归
        return res;
    }

笔者最开始的思路是人类思路,但是不适用于计算机处理。

还是得转化为树这种数据结构来存储,接着递归读取。

但我们不是真的要建树,而是采用相似的思路来处理,方式可以更加便捷。

上述代码实测0ms,beats 100.00% of cpp submissions。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要完成的函数:
  • 说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档