刷题-力扣-面试题 08.09. 括号
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bracket-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
题目分析
- 根据题目描述,生成合法的括号组合
- 深度优先搜索,当可以生成的左括号和右括号个数一样时,只能生成左括号;
当可以生产的左括号个数等于零时,只能生成右括号;
否则即可以生成右括号,又可以生成左括号
代码
class Solution {
public:
vector<string> generateParenthesis(int n) {
insert("", n, n);
return this->parebthesis;
}
private:
std::vector<std::string> parebthesis;
private:
void insert(const std::string str, const int left, const int right) {
if (left == 0 && right == 0) {
this->parebthesis.emplace_back(str);
return;
}
if (left == right) {
insert(str + '(', left - 1, right);
return;
} else if (left == 0) {
insert(str + ')', left, right - 1);
return;
} else {
insert(str + '(', left - 1, right);
insert(str + ')', left, right - 1);
return;
}
return;
}
};