持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
今天,我们继续搞算法。
题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
题目分析
这个题目是让我们返回一个能够生成所有可能的并且 有效的 括号组合。为了保证不重不漏,我们需要确定一个固定的部分分两步走,一部分是外面的括号,一部分是旁边的括号,然后分析结果找到规律,最终实现代码编写。
具体分析过程见代码注释部分(为了保证大家看懂,写的很详细)。
解题思路
- 确定操作对象:本题中,操作对象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;
}
};
总结
这道题目我们主要考虑什么变,什么不变,这样才能做到不重不漏。