22. 括号生成
数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的 括号组合。
示例 1:
输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1输出:["()"]
提示:
1 <= n <= 8
解题思路:
首先先不看边缘条件,如何做到穷举所有的情况——在放下第一个括号的时候,它的下一个可能是左括号,也可能是右括号,下下一个括号可能是左括号也可能是右括号……
于是整体的思路就出来了,用递归给每一层函数里都执行执行两次本函数,第一次传递左括号,第二次传递右括号。
边缘条件:通过分析可以看出左括号只要还有剩余,就可以添加,右括号只能剩余数量大于左括号剩余数量时才可以添加。于是原来设计的每一层函数都执行两次本函数变为有条件的执行,即,当左括号剩余不为0时,传递左括号;当右括号剩余大于左括号时,传递右括号。当左括号剩余等于右括号剩余等于0时,将结果保存;
class Solution {
public:
void func(string str,int n1,int n2,vector<string> &res){
if (n2==0) res.push_back(str);
else{
if (n1!=0){
string t1=str+"(";
func(t1,n1-1,n2,res);
}
if (n2>n1){
string t2=str+")";
func(t2,n1,n2-1,res);
}
}
}
vector<string> generateParenthesis(int n) {
vector<string> res;
func("(",n-1,n,res);
return res;
}
};