leetcode 22括号生成
2018-08-09 21:23 legend聪 阅读(248) 评论(0) 编辑 收藏 举报非常好的一道题。一开始的思想是这样的,先把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; } }*/