🔗 leetcode.cn/problems/ge…
题目
思路
- 回溯,在递归函数的设计上,用了两种办法
- solution 1,枚举当前可以添加 ( 括号的所有可能性,在此基础之上,再枚举可以添加 ) 括号的所有可能性,递归下去,递归结束之后,reset;
- 因为这样枚举可能会有重复的组合,用 set 进行判重
- solution 1, 枚举当前位置,要么添加 一个 (,要么 添加一个 ),递归到 2 * n + 1 的位置结束
- 这样枚举没有重复的情况,好理解,效率高,代码清洗
代码
class Solution {
public:
unordered_set<string> s
void dfs(vector<string>& ans, string& curr, int n, int l, int r) {
if (r == n) {
if (s.count(curr)) return
ans.push_back(curr)
s.insert(curr)
return
}
if (l == n) {
for (int i = 0
curr += ")"
}
dfs(ans, curr, n, n, n)
for (int i = 0
curr.pop_back()
}
return
}
for (int i = 0
for (int k = 0
curr += "("
}
for (int j = 0
for (int k = 0
curr += ")"
}
dfs(ans, curr, n, l + i + 1, r + j)
for (int k = 0
curr.pop_back()
}
}
for (int k = 0
curr.pop_back()
}
}
}
vector<string> solution1(int n) {
vector<string> ans
string curr
dfs(ans, curr, n, 0, 0)
return ans
}
void backtracing(vector<string>& ans, string& curr, int n, int l, int r) {
if (r == n) {
ans.push_back(curr)
return
}
if (l < n) {
curr += "("
backtracing(ans, curr, n, l + 1, r)
curr.pop_back()
}
if (l > r) {
curr += ")"
backtracing(ans, curr, n, l, r + 1)
curr.pop_back()
}
}
vector<string> solution2(int n) {
vector<string> ans
string curr
backtracing(ans, curr, n, 0, 0)
return ans
}
vector<string> generateParenthesis(int n) {
return solution2(n)
}
}