• LeetCode(22)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:

    “((()))”, “(()())”, “(())()”, “()(())”, “()()()”

    分析

    给出数字n,求出所有合法的表达式。

    参考资料

    用二叉树形象的表示这种关系。然后再把二叉树转化为代码的形式。因为二叉树的定义就是递归定义的,因此本题很明显应该使用递归的形式。

    1

    从上面的图片中我们可以很明显的看到,最后五条画黑线的就是最终的结果,其中左分支都是添加左括号,又分支都是添加右括号。

    那么我们在什么情况下添加左括号呢?很明显,最多能添加n个左括号,在递归调用的时候,在能传递到最底层的共用字符串中先添加”(“,然后left-1,递归调用就可以。

    那什么时候添加右括号呢?当左括号个数大于右括号的个数时添加右括号。

    那我们是先添加右括号还是先添加左括号呢?对于这个问题,认真想想其实是无所谓的,只会影响在vector中最后字符串的顺序而已。

    难度主要在以下几个方面:
    1.想到二叉树,想到递归实现。
    2.递归函数的参数形式要考虑清楚才可以。

    AC代码

    class Solution {
    public:
        vector<string> generateParenthesis(int n) {
            if (n == 0)
                return vector<string>();
    
            vector<string > ret;
    
            dfs(ret, "", n, n);
    
            return ret;
        }
    
        //利用二叉树递归思想
        void dfs(vector<string> &ret, string tmp, int left, int right)
        {
            if (0 == left && 0 == right)
            {
                ret.push_back(tmp);
                return;
            }
            else if (left > 0)
                dfs(ret, tmp + '(', left - 1, right);
    
            if (left < right)
                dfs(ret, tmp + ')', left, right - 1);
        }
    
    
    };

    GitHub测试程序源码

  • 相关阅读:
    C#中 @ 的用法
    ASP.NET页面间传值
    ASP.NET中常用的文件上传下载方法
    把图片转换为字符
    把图片转换为字符
    JavaScript 时间延迟
    Using WSDLs in UCM 11g like you did in 10g
    The Definitive Guide to Stellent Content Server Development
    解决RedHat AS5 RPM安装包依赖问题
    在64位Windows 7上安装Oracle UCM 10gR3
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214835.html
Copyright © 2020-2023  润新知