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:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
思路:
如果n=1,那么最终结果都是2个符号,如果n=3,最终结果都是6个符号,所以只需要开一个2*n+1的字符数组
枚举左右括号即可,第2*n个字符用于保存'\0'(字符串结束标记),这样的时间复杂度是2^n次方。由于这样枚举
出来的结果中有许多不合法,所以可以进行剪枝处理。
1)第一个位置一定填充左括号
2)如果当前的右括号个数大于左括号一定是错误的
3)如果左括号个数大于一半,则一定不合法
#include<iostream> #include<bits/stdc++.h> using namespace std; void solve(vector<string>&ans,int n,int i,int left,int right,char ch[]) { if(left>n) return; if(i == 2*n) { ans.push_back(ch); return; } ch[i]='('; solve(ans,n,i+1,left+1,right,ch); if(right<left) { ch[i]=')'; solve(ans,n,i+1,left,right+1,ch); } } vector<string> generateParenthesis(int n) { vector<string>ans; if(n==0) return ans; char ch[2*n+1]; ch[0]='('; ch[2*n]='\0'; solve(ans,n,1,1,0,ch); return ans; } int main() { vector<string>ans; ans=generateParenthesis(1); for(int i=0;i<ans.size();i++){ cout<<ans[i]<<endl; } return 0; }