题目说明
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
测试样例
输入:3
输出:["((()))","(()())","(())()","()(())","()()()"]
题意理解
要求列出所有情况,且每种情况都有效,即对于每个右括号及其左边,右括号的数目必然小于左括号。
解题方案
可以使用递归解决问题,这种属于回溯性质的递归算法,不仅需要判断退出条件,还需要判断分支条件进行剪枝,本题退出条件即为左右括号数相等且都等于n,剪枝条件则是排除左括号多余n的情况和右括号多余左括号的情况。
class Solution {
public:
vector<string> res;
void generater(string tmp,int l,int r,int n){
if(r == n){//递归退出,因为右括号一定小于等于左括号,所以只需要判断右
res.push_back(tmp);
return ;
}
if(l<n){//还可以加入左括号
generater(tmp+'(',l+1,r,n);//加入左括号
if(r<l)
generater(tmp+')',l,r+1,n);//如果可以加入右括号则加入
}else
generater(tmp+')',l,r+1,n);//加入右括号
}
vector<string> generateParenthesis(int n) {
generater("",0,0,n);
return res;
}
};
所有代码都可以在我的github上找到:LeetCode