zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    求逆序对的解法
    关于宽搜BFS广度优先搜索的那点事
    大数乘法 poj2389
    二分求幂(快速求幂,二进制求幂)
    2n皇后问题
    poj2406 Power Strings (kmp 求最小循环字串)
    poj1050查找最大子矩阵和
    二叉树的建立和遍历
    已知二叉树前序和中序,求二叉树。
    c/c++连接mysql数据库设置及乱码问题(vs2013连接mysql数据库,使用Mysql API操作数据库)
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9403974.html
Copyright © 2011-2022 走看看