leetcode刷题之括号生成

题目

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

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

解题思路

拿到这个题,首先想到的是怎么插!
由于不是计算机科班出身,对回溯法没有什么概念!
举个例子讲吧:比如输入的是4,那就是说有四对括号,你要给出所有有效的结果,那么我先提前搞一个字符串 s = " ( ( ( ( " s="((((" s="((((",里面包含4个左括号,现在你手里有4个右括号,接下来你就在这个字符串中插完手中的右括号!怎么插!

在这里插入图片描述
先看插入点1,前面没有’(’,所以不能插’)’;插入点2:前面有1个’(’,所以可以插入的’)‘个数为[0,1],插入点3:前面有2个’(’,所以可以插入的’)'个数为[0,2],依次类推直到插入点5。

接下来再考虑,你手里只有4个,插入’)‘的个数肯定要小于等于4;另外,如果前面有’(’,但是人家’(‘找到匹配对象’)’,你这时候就不能再插入了!思路到这里是不是有点清晰了!

那么当前插入点到底可以插多少个’)‘呢?回答:可以插入’)‘的个数,一定要小于等于手里’)‘的个数,还要小于前面’(‘的个数,还要小于前面有多少没有配对的’('个数。ok!明白了之后就开始插吧!看代码!

解题代码

class Solution {
public:
    void insertS(vector<string>& ans, string s, int pos, int k, int nums, int n,int m) {
    /*
        ans ------保存结果
        s ------当前字符串
        pos ------当前点前面有多少个'('
        k   ------字符串s当前插入点
        nums ------当前有多少个待插入字符')'
        n ------ 结果必须满足的n对括号
        m ------ 当前插入点前面有多少'('没有')'相匹配
    */
    if (nums == 0) { //如果都插完了,就添到结果里
        ans.push_back(s);
        return;
    }
    if (pos == n) {//如果插到最后,还有')'没插完,就全部放到最后,然后添到结果里
        string tmp(nums, ')');
        s = s + tmp;
        ans.push_back(s);
        return;
    }else {
        for (int i = 0; i <= pos && i <= nums && i <= m; ++i) {
        //当前位置插入的')'个数,应该小于前面'('的个数,前面没匹配到')'的'('的个数,以及当前还有多少个')'
            string s1(s);
            s1.insert(k, i, ')');
            insertS(ans, s1, pos + 1, k + i + 1, nums - i, n,m-i+1);//那就插吧
        }
    }
    

}
vector<string> generateParenthesis(int n) {
    vector<string> ans;
    if (n <= 0) {
        return ans;
    }
    string s(n, '(');

    insertS(ans, s, 1, 1, n, n,1);
    return ans;
}
};

结果

在这里插入图片描述

反思

这个算法时间复杂度是指数级别,说白了算法的过程就是取树高为n的大部分结点到答案中。我看了官方的解题思路,感觉它写的很清晰,从无到有生成括号字符串,从暴力解法逐步优化。我太菜了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值