leetcode 22括号生成

非常好的一道题。一开始的思想是这样的,先把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;
    }
}*/
原文地址:https://www.cnblogs.com/legendcong/p/9451841.html