【leetcode】22. 括号生成。 [回朔算法]

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

有效括号组合需满足:左括号必须以正确的顺序闭合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:

输入:n = 1
输出:["()"]

提示:

1 <= n <= 8

思路:
首先可以采取最暴力的方法,有一个用来检验括号匹配的函数,一个工作函数(恕我没有啥取名字的天分),在里面依次加入(和),不断推入字符串然后进行往下循环,在本次循环结束的时候再pop弹出开始下一个组合,最后全部循环完以后再根据判断函数来判断是否符合括号进行输出;
在上面这种方法基础上可以进行优化,使用回朔法来进行化简。要想满足括号匹配的条件,第一是要保证(的数量小于n,同时还要保持)的数量小于(的数量,因为如果)多于(那么就必会存在不符合条件的括号了,所以只有满足条件时我们才进行+括号然后进行递归回朔。

代码区1:

class Solution {
public:
vector<string> res;
string str;
    bool judge(string s){
        int balance=0;
        for(int i=0;i<s.length();i++){
            if(s[i]=='(')
                balance++;
            else if(s[i]==')')
                balance--;
            if(balance<0)
            return false;

        }
    return balance==0;
    }
    void work(int d,int n,string str){
        if(d==n){
            if(judge(str))
                res.push_back(str);
            return;
        }
        str+='(';
        work(d+1,n,str);
        str.pop_back();
        str+=')';
        work(d+1,n,str);
        str.pop_back();
    }
    vector<string> generateParenthesis(int n) {
        work(0,2*n,str);
        return res;
    }
};

代码区2:


class Solution {
public:
    vector<string> res;//字符串容器用来存放结果res
    string s;
    void work(vector<string>&res,string s,int close,int open,int n){
        if(s.length()==n*2){//当s的长度为n的两倍时说明括号已经全部齐了
            res.push_back(s);//将s推入到res中
            return;
        }
        if(open<n){//当左括号的数量小于n的时候往s中加(然后进行递归
            s.push_back('(');
            work(res,s,close,open+1,n);
            s.pop_back();//最后再将插入的(弹出进行下一次循环
        }
        if(close<open){
            s.push_back(')');
            work(res,s,close+1,open,n);
            s.pop_back();
        }
    }
    vector<string> generateParenthesis(int n) {
        work(res,s,0,0,n);//开始进行,都从0开始
        return res;
    }
};

新手上路,有错请指正;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Khalil三省

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值