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+')');
        }
    }
};

 

时间: 2024-10-30 13:44:52

Generate Parentheses的相关文章

leetcode 22 Generate Parentheses关于C++ string的问题

问题描述 leetcode 22 Generate Parentheses关于C++ string的问题 /* 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: "((()))", "(()())", "(())

[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: "((()))", "(()())", "(())()", "()(())", "()()()" [分

【LeetCode从零单排】No22.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: "((()))", "(()())", "(())()", "()(())", "()()()" 代码 F

LeetCode 22 Generate Parentheses(生成括号)

翻译 给定一个括号序列,写一个函数用于生成正确形式的括号组合. 例如,给定n = 3,一个解决方案集是: "((()))", "(()())", "(())()", "()(())", "()()()" 原文 Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes

UVa 673 Parentheses Balance (栈)

673 - Parentheses Balance Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=614 You are given a string consisting of parentheses () and []. A string of thi

&lt;font color=&quot;red&quot;&gt;[置顶]&lt;/font&gt;

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸,本博客会持续更新,感谢您的支持,欢迎您的关注与留言.博客有多个专栏,分别是关于 Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 . Android应用开发 ,而最近会添加的文章将主要是算法和Android,不过其它内容也会继续完善. About the Author 独立 Windows App 和

leetcode难度及面试频率

转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two Pointers 2 Add Two Numbers 3 4 linked list Two Pointers           Math 3 Longest Substring Without Repeating Characters 3 2 string Two Pointers      

careercup-递归和动态规划 9.6

9.6 实现一种算法,打印n对括号的全部有效组合(即左右括号正确配对). 类似leetcode:Generate Parentheses 解法: 从头开始构造字符串,从而避免出现重复字符串.在这个解法中,逐一加入左括号和右括号,只有字符串仍然有效.每次递归调用,都会有个索引指向字符串的某个字符.我们需要选择左括号或右括号,那么,何时可以用左括号,何时可以用右括号呢? 左括号:只有左括号还没有用完,就可以插入左括号 右括号:只有不造成语法错误,就可以插入右括号.何时出现语法错误?如果右括号比左括号

LeetCode总结【转】

转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetcode.com的online judge中151道算法题目.除各个题目有特殊巧妙的解法以外,大部分题目都是经典的算法或者数据结构,因此做了如下小结,具体的解题思路可以搜索我的博客:LeetCode题解 题目 算法 数据结构 注意事项 Clone Graph BFS 哈希表 Word Ladder II