题目描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
方法:DFS+剪枝
class Solution {
public:
int numl=1;
int numr=0;
string str="(";
int deep=1;
vector<string> s;
vector<string> ans;
vector<string> generateParenthesis(int n)
{
if(n==1)
{
ans.push_back("()");
return ans;
}
int num=n;
s.push_back("(");
for(int i=1;i<n;i++)
s.push_back("()");
dfs(numl,numr,str,n,num);
return ans;
}
void dfs(int numl,int numr,string str,int n,int num)
{
if(deep<2*n-1)
{
for(int i=0;i<2;i++)
{
if(numl>=numr&&numl<=num)
{
if(i==0) dfs(numl+1,numr,str+s[deep].substr(i,1),deep+1,num);
if(i==1) dfs(numl,numr+1,str+s[deep].substr(i,1),deep+1,num);
}
else continue;
}
}
if(numl==num&&numr==num) ans.push_back(str);
}
};
思路:
首先,将n对括号对应的“搜索树” 建立出来,例如:n=3时,建立一个vector<string>s,s=['(','()','()','()','()','()'],这样,对应的搜索树就是这样:
深搜时,设置两个计数器,分别记录左括号和右括号的数量,当i=0时,左括号+1;i=1时,右括号+1。当左括号数量大于3或者左括号数量大于右括号时,进行剪枝(也就是不继续往下搜索了,回溯到上一个递归中继续搜索)。