leetcode-22-括号生成

题目描述:

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

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

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

 

要完成的函数:

vector<string> generateParenthesis(int n) 

 

说明:

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

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

 

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

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

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

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

相当麻烦的一种做法。

 

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

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

代码如下:(附详解)

    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。

posted @ 2018-08-01 21:17  chenjx85  阅读(313)  评论(0编辑  收藏  举报