LeetCode-22 Generate Parentheses

本文介绍了一种生成合法括号序列的算法实现。通过递归和栈操作来确保括号匹配正确,最终输出所有可能的合法括号组合。文章详细展示了类`Solution`的定义及其核心方法`generateParenthesis`的具体实现。

题目:给定一个数字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;
    }
    
   
    
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值