码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 22括号生成

时间:2018-08-09 22:04:40      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:bit   ack   parent   public   perm   com   space   ref   ++   

非常好的一道题。一开始的思想是这样的,先把n对括号按照某一顺序生成一个string,然后用全排列算法生成所有可能,然后利用stack写一段判断括号是否匹配的字符串,匹配的假如结果中。不过会超时。因为全排列的复杂度略高,阶乘级别。而对于阶乘函数和指数函数的复杂度,显然是阶乘函数高,指数每次乘一个相同的数(这里是2),而阶乘每次乘一个更大的数.全排列算法复杂度会很大,超时也就不奇怪了。所以对于n对括号,有2n个位置,每个位置都有两种选择,所以一共是4的n次幂。leetcode显示超时也是从n=5开始的,可以想象,超时的原因就是因为5>4,阶乘超越了指数。再引入两个变量记录左括号的数量和右括号的数量,只要满足两个条件1.右括号的数目一定要小于左括号的数量2.左括号的数量和右括号的数量都不能超过n个。满足这两个条件就一定是匹配的。相当于一个非常巧妙的减枝。

#include<bits/stdc++.h>
using namespace std;
class Solution {
private:
    vector<string>res;
    string ans;
    void permutation(int index,int n,int left,int right)
    {
        if (right > left||left>n||right>n)
            return;
        if (index == 2 * n)
        {
            res.push_back(ans);
            return;
        }
        ans.push_back(();
        permutation(index + 1, n,left+1,right);
        ans.pop_back();
        ans.push_back());
        permutation(index+1, n,left,right+1);
        ans.pop_back();
        return;
    }
public:
    vector<string> generateParenthesis(int n) {
        permutation(0,n,0,0);
        return res;
    }
};
/*int main()
{
    vector<string>res;
    res= class Solution().generateParenthesis(3);
    for (int i = 0; i < res.size(); i++)
    {
        cout << res[i] << endl;
    }
}*/

 

leetcode 22括号生成

标签:bit   ack   parent   public   perm   com   space   ref   ++   

原文地址:https://www.cnblogs.com/legendcong/p/9451841.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!