22 括号生成

本文最后更新于:2021年6月27日 下午

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例:

1
2
3
4
5
6
7
8
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]

Solution

参考:《算法小抄》4.3

  • 回溯算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# @lc code=start
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if not n: return
res = []
track = []

def backtrack(left, right, track):
# 数量小于0,不合法
if left<0 or right<0: return
# 左括号剩余大于右括号,不合法
if right<left: return
# 所有括号都刚好用完
if left==0 and right==0:
res.append(''.join(track))
return

track.append('(')
backtrack(left-1, right, track)
track.pop()

track.append(')')
backtrack(left, right-1, track)
track.pop()

backtrack(n, n, track)
return res
# @lc code=end

cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
vector<string> generateParenthesis(int n) {
string s = "";
backtrack(n, n, s);
return res;
}
private:
vector<string> res;

void backtrack(int left, int right, string s) {
if (left < 0 || right < 0) return;
if (left > right) return;
if (left == 0 && right == 0) {
res.emplace_back(s);
}
s.push_back('(');
backtrack(left-1, right, s);
s.pop_back();

s.push_back(')');
backtrack(left, right-1, s);
s.pop_back();

return;
}
};

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!