括号生成
https://leetcode.cn/problems/generate-parentheses/description/
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
左括号数必须大于右括号数,且小于等于n
class Solution {
public:
vector<string> ans;
void generator(string ch, int n, int cur_l, int cul_r) {
if (cur_l < cul_r) {
return;
}
if (cur_l == n && cul_r == n) {
// 结束条件是出现了三次(或者")"
ans.push_back(ch);
return;
}
if (cur_l <= n-1) {
generator(ch + "(", n, cur_l + 1, cul_r);
}
if (cul_r <= n-1) {
generator(ch + ")", n, cur_l, cul_r + 1);
}
return;
}
vector<string> generateParenthesis(int n) {
generator("(", n, 1, 0);
return ans;
}
};
笨办法,迭代所有的节点,然后判断是否符合,
class Solution {
public:
vector<string> ans;
bool isValid(string ch) {
stack<char> s;
for (auto c : ch) {
if (c == '(') {
s.push(c);
} else {
if (!s.empty()) {
s.pop();
} else {
return false;
}
}
}
if(s.empty()){
return true;
}
return false;
}
void generator(string ch, int n, int cur) {
if (cur == n*2) {
// 结束条件是出现了三次(或者")"
if (isValid(ch))
{
ans.push_back(ch);
}
return;
}
generator(ch+"(",n,cur+1);
generator(ch+")",n,cur+1);
return;
}
vector<string> generateParenthesis(int n) {
generator("",n,0);
return ans;
}
};