题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
---------------------传引用s------------------------------
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string s;
dfs(result, s, n, n);
return result;
}
private:
void dfs(vector<string>& result, string& s, int l, int r){
if(l==0&&r==0){
result.push_back(s);
return;
}
if(l>0){//如果需要的左括号不是0,还可以放左括号
s.push_back('(');
dfs(result, s, l-1, r);
s.pop_back();
}
if(r>l){//如果需要的右括号大于左括号,就可以放右括号
s.push_back(')');
dfs(result, s, l, r-1);
s.pop_back();
}
}
};
------------------------传值s-------------------------
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string s;
dfs(result, s, n, n);
return result;
}
private:
void dfs(vector<string>& result, string s, int l, int r){
if(l==0&&r==0){
result.push_back(s);
return;
}
if(l>0) dfs(result, s+'(', l-1, r);
if(r>l) dfs(result, s+')', l, r-1);
}
};
- 思路
- 什么是合法的括号序列
- 序列的任意前缀中左括号数量必然多于有括号数量
- 左右括号数量相等
- dfs函数
- 递归边界为需要的左右括号数均为0
- 如果需要的左括号数不是0,就放一个左括号,等后续的右括号来匹配
- 如果需要的右括号数大于左括号,就可以放一个右括号
- 存储当前路径的s,传引用与传值的区别
- 传引用不能再函数调用时直接使用重载的+运算符。且在递归调用前添加括号,递归调用后要恢复原样
- 传值可以再函数调用时直接使用重载的加运算符。且递归调用不需要恢复原状,但是传值要慢一些。
- 什么是合法的括号序列