• 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:

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

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

    这个递推式的定义,很多这类问题都可以归结成这个表达式。这个题对于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+')');
            }
        }
    };
  • 相关阅读:
    雅虎天气API调用
    HttpOperater
    HttpOperater-模拟HTTP操作类
    页面局部加载,适合Ajax Loading场景(Demo整理)
    FTPHelper-封装FTP的相关操作
    使用SOCKET实现TCP/IP协议的通讯
    IIS目录禁止执行权限
    Oracle10g 安装步骤
    SQL Server 2008、SQL Server 2008R2 自动备份数据库
    SQL列转行
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4125856.html
Copyright © 2020-2023  润新知