题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
问题分析
这是一道DFS的题。递归函数有3个可变参数:剩余左括号数left,剩余右括号数right和当前的字符串。初始时,left是n,right是n,当前的字符串是""。每次在DFS函数中时,如果剩余左括号数大于0,则在传入的当前的字符串后面连接上左括号,并以新的参数进入DFS函数;同样的,每次在DFS函数中时,如果剩余右括号数大于0,则在传入的当前的字符串后面连接上右括号,并以新的参数进入DFS函数,以上是DFS函数的基本递归思路。而递归基是在DFS函数中的开始处判断的,如果当前传入的左括号剩余数大于右括号剩余数,说明传入的当前字符串已经是无效了的,就不用往后进行了,需及时return。如果当前传入的左括号剩余数和右括号剩余数都等于0,则说明传入的当前字符串是已经满足条件了的,加入答案数组中并return。最终进行完所有搜索后,返回答案数组ans。
代码实现
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
DFS(n, n, "", ans);
return ans;
}
void DFS(int left, int right, string out, vector<string>& ans){
if(left>right)
return;
if(left==0 && right==0){
ans.push_back(out);
return;
}
if(left>0)
DFS(left-1, right, out+"(", ans);
if(right>0)
DFS(left, right-1, out+")", ans);
}
};