题目描述:数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
题目分析:生成n对括号的所有合法组合,关键在于“所有”与“合法”。所以这道题的一个思路就是首先生成所有可能的序列组合,接下来筛选出所有符合条件的序列即可。合法是指我们从左到右遍历序列时,‘(’的数目一定要大于等于‘)’的数目。关于所有组合我们可以通过树的方式画图展开,下面图就是n=2情况下的所有可能结果
我们一次添加一个‘(’或者‘)’,当右括号数大于左括号树时说明不合法,接下来就没有必要走下去了,这也就是所谓的剪枝过程的体现。
代码解析:
void backtracking(int n, vector<string> &res, int left, int right, string cur){
//n表示括号组数,res用于存储结果,left为当前字符串cur中的左括号数,right为右括号数
//递归终止条件
if(left ==n && right == n){//左右括号数都为n说明当前的字符串是合法的,添加到res中
res.push_back(cur);
return;
}
if(right > left)//右括号数大于左括号,非法,剪枝
return;
if(left < n){//添加一个左括号
backtracking(n, res, left+1, right, cur+'(');
}
if(right < left){//添加一个右括号
backtracking(n, res, left, right+1, cur+')');
}
}
vector<string> generateParenthesis(int n) {
vector<string> res;
backtracking(n, res, 0, 0, "");
return res;
}