一、题目
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 回溯(DFS)
(1)思路
不断添加可能的括号直至达到目标对数,并通过递归方法回溯。
判断括号有效的方法:
1)左括号数小于目标对数;
2)右括号数小于左括号数。
(2)代码
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
backtrack(ans, "", 0, 0, n);
return ans;
}
void backtrack(vector<string>& ans, string str, int l, int r, int n) {
if (l + r == 2 * n) {
ans.push_back(str);
return;
}
if (l < n)
backtrack(ans, str + "(", l + 1, r, n);
if (r < l)
backtrack(ans, str + ")", l, r + 1, n);
}
};
(3)结果
执行用时 :8 ms, 在所有 C++ 提交中击败了 84.90% 的用户;
内存消耗 :17.1 MB, 在所有 C++ 提交中击败了 71.58% 的用户。
三、其他
注意传递结果向量 ans 时,必须将函数入参设置为引用传递。