LeetCode 22. Generate Parentheses

  1. 题目描述

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:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
2.解题思路

这一眼下去想到,嗯,卡特兰数。按照递归求解问题。
n个括号的组合,那么可能左边有n-i个括号,右边是i个括号的组合。
注意的是i=0的时候,左边是n-1个括号的组合,然后外面加一个括号。
按照这个思路进行递归,我们就可以得到答案了嗯
最后做一个去重的工作就可以了。

3.实现代码

class Solution {
public:
    vector<string> easyP(int n){
        vector<string> res;
        string s;
        for(int i=1;i<=n;++i){
            s+='(';
        }
        for(int i=1;i<=n;++i){
            s+=')';
        }
        res.push_back(s);
        return res;
    }

    vector<string> mix(vector<string> p,vector<string> q){
        vector<string> res;
        for(int i=0;i<p.size();++i){
            for(int j=0;j<q.size();++j){
                res.push_back(p[i]+q[j]);
            }
        }
        return res;
    }

    vector<string> gP(int n) {
        vector<string> res;
        if(n==0)
            return res;
        if(n==1){
            res.push_back("()");
            return res;
        }
        if(n>=2){
            vector<string> t=gP(n-1);
            for(int i=0;i<t.size();++i){
                t[i].insert(t[i].begin(),'(');
                t[i].insert(t[i].end(),')');
            }
            res.insert(res.end(),t.begin(),t.end());
            for(int i=n-1;i>=1;--i){
                t=mix(gP(i),gP(n-i));
                res.insert(res.end(),t.begin(),t.end());
            }

        }
        return res;

    }

    vector<string> generateParenthesis(int n){
        vector <string> res=gP(n);
        sort(res.begin(),res.end());
        vector<string>::iterator iter;
        iter = unique(res.begin(),res.end());
        if(iter != res.end()){
            res.erase(iter,res.end());
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值