数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
Method:
一个合法的括号序列需要满足两个条件:
1.左右括号数量相等(即为题干中提到的:有效的)
2.任意前缀中:左括号的数量>=右括号的数量
我们可以利用以上两个性质,使用深度优先搜索进行遍历
Code:
class Solution{
public:
// 括号生成递归子函数
void generate_sub_Parenthesis(vector<string> &result,string s,int left,int right,int n){
// 当前子串右括号为n,意味着深度优先遍历结束
if(right==n){
// 将子串存放到结果数组中
result.push_back(s);
}
// 如果仍有左括号没放完,深度优先遍历,因此先添加左括号
if(left<n){
generate_sub_Parenthesis(result,s+"(",left+1,right,n);
}
// 如果仍有右括号没放完,深度优先遍历,因此添加右括号
if(left>right){
generate_sub_Parenthesis(result,s+")",left,right+1,n);
}
}
// 括号生成
vector<string> generateParenthesis(int n){
// 定义一个数组保存子串
vector<string> result;
// 递归进行深度优先遍历
generate_sub_Parenthesis(result,"",0,0,n);
// 返回所有子串
return result;
}
};
Reference:
LeetCode 22. 括号生成【c++/java详细题解】_林小鹿@的博客-CSDN博客
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/generate-parentheses