给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考https://mp.weixin.qq.com/s/_8LFejdp9yUMeKqrx-q9YQ
思路如下:
利用递归的思想,如何得到n对括号呢? 就是从n-1对括号来进行变化,所以我们要找到这个 n对括号和 n-1 对括号的关系:
generate(n) = "(" + generate(i) + ")" + generate(j) ,其中 i + j == n - 1
有如下场景:
1对:
()
2对: n = 2 ,n -1 = 1
所以要么是i为1,要么是j为1.
(()) i为1
()() j为1
3对: n = 3, i + j = 2
()(()) i = 0, j= 2
()()() i = 0, j= 2
(())() i = 1, j = 1
((())) i=2, j=0
(()()) i =2 , j=0
依次类推...
所以代码写的思路就按照上面的,先固定i的值,随之就固定了j的值,因为两者相加等于n-1
然后把所有的情况都遍历完成即可
class Solution {
public:
vector<string> generateParenthesis(int n)
{
if (n == 0) return {""}; // 基本情况
vector<string> ans;
for (int i = 0; i < n; i++)
{
for (string left : generateParenthesis(i)) // 挑选 s
{
for (string right : generateParenthesis(n - i - 1)) // 挑选 t
{
ans.push_back("(" + left + ")" + right); // 构造
}
}
}
return ans;
}
};