数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
数据的存储,使用一个vector比较方便,可以一次性的把结果压入;
一开始想的是排列组合,看与2^n之间的关系,但太复杂了,把人推懵了。
后来想到左边有一个那么右边就得有一个,就可以从左到右的逐一匹配,最好的方法是用递归,那么边界条件就是左边到了N个,右边也到了N个,并且左边的个数一定要小于右边(如果左边的个数大于右边,默认左边是"(“,那么左边的N个”(“就用完了,会多用到”)",不符合条件)
其实里面具体怎么实现的我也不知道,反正用递归能把这个过程忽略掉。代码似乎有点像DFS,边界条件可以理解为剪枝。
class Solution {
public:
void build_(vector<string> &res, string str, int l, int r, int n)
{
if(l>n || r>n || l<r) return;
if(l == n && r == n)
{
res.push_back(str);
return;
}
build_(res, str+"(", l+1, r, n);
build_(res, str+")", l, r+1, n);
}
vector<string> generateParenthesis(int n) {
vector<string> res;
build_(res, "", 0, 0, n);
return res;
}
};