面向小白的力扣22. 括号生成

104 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

今天,我们继续搞算法。

题目描述

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

image.png

题目分析

这个题目是让我们返回一个能够生成所有可能的并且 有效的 括号组合。为了保证不重不漏,我们需要确定一个固定的部分分两步走,一部分是外面的括号,一部分是旁边的括号,然后分析结果找到规律,最终实现代码编写。

具体分析过程见代码注释部分(为了保证大家看懂,写的很详细)。

解题思路

  • 确定操作对象:本题中,操作对象1个n
  • 确定操作条件:如果数为空返回空数组。
  • 确定操作过程:操作过程为,遍历获得组合中所有可能的情况,进行组合。
  • 确定结果返回:返回最终结果。

代码

/*
["((()))","(()())","(())()","()(())","()()()"]
"((()))" : 外面是大括号,里面是一个括号包着另一个括号,旁边没括号
"(()())" :外面是大括号,里面是两个括号,旁边没有括号
"(())()" :外面是大括号,里面是一个括号,旁边一个括号
"()(())" :外面是大括号,里面没有括号,旁边是一个括号包着另一个括号
"()()()" :外面是大括号,里面没有括号,旁边是两个括号

我们继续分析,n是3,一共是5种可能,编程就是找共性。
外面都是一个(),里面可能会有2个括号"((()))","(()())"两种情况 k=3,n-k都是0
外面都是一个(),里面可能会有1个括号"(())()" 1种情况          k=2,n-k是1
外面都是一个(),里面没有括号,"()(())","()()()" 2种情况      k=1,n-k是0

我们继续分析,n是3,但外面已经有一个括号是固定的,所以剩下应该是n-1,对吧,但这样其实还不够,因为括号里面可能还有括号,所以分成两部分:一部分是括号里面的括号,可能有k个,但前面已经有一个,所以能用到的就是k-1个,那剩下的就给外面就是n-k个。
*/
class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        if(n == 0) return {""} ;
        for(int k=1 ; k<=n;k++){
            vector<string> outs = generateParenthesis(k-1);
            vector<string> nears = generateParenthesis(n-k);
            for(string& out:outs){
                for(string& near : nears){
                   string s = "("+out+")"+near;
                   ans.push_back(s);
                }
            }
        }    
        return ans;
    }
};


总结

这道题目我们主要考虑什么变,什么不变,这样才能做到不重不漏。