Ideas
n很小,考虑深搜
每次添加之前计算括号的数量,判断是否有效
如果左括号数量不大于 n,我们可以放一个左括号。
如果右括号数量小于左括号的数量,我们可以放一个右括号。
Code
class Solution {
public:
int nn;
vector<string> ans;
void dfs(int now, int zuo, int you, string& path)
{
if (now == 2 * nn + 1) {
ans.push_back(path);
return;
}
if (zuo < nn) {
path.push_back('(');
dfs(now + 1, zuo + 1, you, path);
path.pop_back();
}
if (zuo > you) {
path.push_back(')');
dfs(now + 1, zuo, you + 1, path);
path.pop_back();
}
}
vector<string> generateParenthesis(int n) {
nn = n;
string path;
dfs(1, 0, 0, path);
return ans;
}
};
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
ans = []
def backtrack(s, l, r):
if len(s) == 2 * n:
ans.append(''.join(s))
if l < n:
s.append('(')
backtrack(s, l + 1, r)
s.pop()
if l > r:
s.append(')')
backtrack(s, l, r + 1)
s.pop()
backtrack([], 0, 0)
return ans