题目:给定一个数字N,代表()的数目,输出N个()可以组成的合法的闭合结构
思路:1、可以对每一个组合,判断其是否是合法的闭合结构,实现可以使用一个栈,然后将N个‘(’和N个‘)’递归入栈,入完后判断
2、拼接字符串,N个‘(’和N个‘)’递归拼接到一个字符串上,每次在尾端拼接。
class Solution {
private:
struct node{
int stack_value[100];
int point_stack;
}stack_temp;
int temp_n;
int all_cou=0;
vector<string> result;
public:
void stack_in(int m){
stack_temp.point_stack++;
stack_temp.stack_value[stack_temp.point_stack]=m;
}
int stack_out(){
if(stack_temp.point_stack==-1)return -1;
int temp=stack_temp.stack_value[stack_temp.point_stack];
stack_temp.point_stack--;
return temp;
}
int min_stack(){
return stack_temp.stack_value[stack_temp.point_stack];
}
void out_stack(){
int count1=0;
while(stack_temp.point_stack>=0){
if(stack_out()==1){count1++;}
else{count1--;}
if(count1<0){return;}
}
if(count1==0){
all_cou++;
stack_temp.point_stack=2*temp_n-1;
string s="";
while(stack_temp.point_stack>=0){
if(stack_out()==1)s.push_back('(');
else s.push_back(')');
}
result.push_back(s);
}
}
void push(int num,int num1,int num2){
if(num1==temp_n&&num2==temp_n){
out_stack();
return;
}
else if(num1==temp_n){
if(num==1){
return;
}
else{
stack_in(2);
push(2,num1,num2+1);
}
}
else if(num2==temp_n){
if(num==2){
return;
}
else{
stack_in(1);
push(1,num1+1,num2);
}
}
else{
if(num==1){
stack_in(1);
int temp1=stack_temp.point_stack;
push(1,num1+1,num2);
stack_temp.point_stack=temp1;
push(2,num1+1,num2);
}
else{
stack_in(2);
int temp2=stack_temp.point_stack;
push(1,num1,num2+1);
stack_temp.point_stack=temp2;
push(2,num1,num2+1);
}
}
}
vector<string> generateParenthesis(int n) {
temp_n=n;
stack_temp.point_stack=-1;
int num1=0,num2=0;
push(2,num1,num2);
return result;
}
};