Generate Parentheses -- leetcode

原创 2016年08月29日 15:55:38

题目描述:
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

题目大意:
给定整数 n,生成 n 个“()”排列。有Ann种。
For example, given n = 3, a solution set is:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

思想:
规则:左括号的个数 大于等于 右括号的个数
假设我们已经打印了 m 个括号,此时 左括号剩余 left 个右括号 剩余 right 个
是否可以继续打印左括号,取决于剩余的左括号个数left是否大于0,如果大于0,则可以继续打印左括号。
是否可以打印右括号,在剩余的右括号大于0的前提下,还要满足剩余左括号的个数left 小于 剩余右括号的个数right(即已经打印的左括号个数 大于 已经打印的右括号个数),如若,剩余左括号的个数 left 大于 等于 剩余右括号的个数 right, 即已经打印的左括号个数 小于等于 右括号的个数(即:“相等情况:(())”“小于情况(不成立):())”),此时,再打印右括号,导致括号不匹配。

代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

void createParenthesis(vector<string>&, string, int, int);
vector<string> generateParenthesis(int);
int main()
{
    int n;
    cin >> n;
    vector<string> ans = generateParenthesis(n);
    for (int i = 0; i < ans.size(); ++i) {
        cout << ans[i] << endl;
    }
    return 0;
}
/*
    left : 左括号剩余个数
    right : 右括号剩余个数
*/
void createParenthesis(vector<string>& ans, string s, int left, int right) {
    //左右括号剩余为0,保存此序列
    if (left == 0 && right == 0)
        ans.push_back(s);

    //剩余左括号个数大于0,可以继续打印左括号
    if (left > 0)
        createParenthesis(ans, s + '(', left - 1, right);

    //剩余右括号个数大于0,且剩余左括号的个数小于右括号
    //即已经打印的左括号个数大于已经打印的右括号的个数,可以继续打印左括号
    if (right > 0 && left < right)
        createParenthesis(ans, s + ')', left, right - 1);
}

vector<string> generateParenthesis(int n) {
    vector<string> ans;
    if (n <= 0) return ans;
    string s = "";
    createParenthesis(ans, s, n, n);
    return ans;
}

结果:
结果

版权声明:本文为博主原创文章,欢迎转载,请注明出处。

leetcode之 Generate Parentheses

题目:http://oj.leetcode.com/problems/generate-parentheses/ 描述:给定一个非负整数n,生成n对括号的所有合法排列。 解答: 该问题解的个数就是卡特...
  • yutianzuijin
  • yutianzuijin
  • 2013年10月26日 23:19
  • 21775

LeetCode Generate Parentheses 深度分析理解

以我的思维,我是使用二叉树的思维思考这个算法的 我考虑这个递归树的时候有两个难点: 1 如何两边同时遍历一棵树? 2 如何剔除不适合的路径?比如最中间的路径是不满足条件的。 到底是什么样的树?构...
  • kenden23
  • kenden23
  • 2013年11月26日 08:05
  • 3582

LeetCode 22 — Generate Parentheses(C++ Java Python)

题目:http://oj.leetcode.com/problems/generate-parentheses/ Given n pairs of parentheses, write a func...
  • dragon_dream
  • dragon_dream
  • 2014年04月17日 11:11
  • 3018

LeetCode 22 Generate Parentheses (C,C++,Java,Python)

Problem: Given n pairs of parentheses, write a function to generate all combinations of well-fo...
  • runningtortoises
  • runningtortoises
  • 2015年05月10日 21:11
  • 1363

【LeetCode-面试算法经典-Java实现】【022-Generate Parentheses(生成括号)】

【022-Generate Parentheses(生成括号)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given n pairs of parentheses, ...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月23日 07:52
  • 2480

[leetcode]Generate Parentheses 生成圆括号 python实现

Generate Parentheses
  • zl87758539
  • zl87758539
  • 2016年06月12日 09:36
  • 683

LeetCode --- 22. Generate Parentheses

题目链接:Generate Parentheses Given n pairs of parentheses, write a function to generate all combinatio...
  • makuiyu
  • makuiyu
  • 2015年01月31日 13:08
  • 2486

leetcode——backtracking[1] Generate Parentheses ,Catalan数——卡特兰数

Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes...
  • steelhe
  • steelhe
  • 2015年08月19日 10:15
  • 291

LeetCode22GenerateParentheses--In Java

这个问题让人想到火车进站的次序问题,解的数量可以用卡特兰数求出。  因此我想到其实括号的排列和栈混洗的各个情况是一一对应的。  现有1、2、3三个数字,栈混洗后有123,132,213,231,321...
  • sinat_27564919
  • sinat_27564919
  • 2016年02月21日 19:32
  • 308

leetCode 22.Generate Parentheses (生成括号) 解题思路和方法

Generate Parentheses  Given n pairs of parentheses, write a function to generate all combinatio...
  • xygy8860
  • xygy8860
  • 2015年07月06日 22:11
  • 747
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Generate Parentheses -- leetcode
举报原因:
原因补充:

(最多只允许输入30个字)