题意
给定一个n,求由n个左括号和n个右括号组成的合法括号序列。
思路
算法1
直接暴力dfs,直接枚举当前位置为’(‘还是’)’,递归终点用栈判断结果是否合法。
算法2
在dfs的时候就保证结果的合法性。
括号序列的基本格式就下面两种:
- 相邻,
()()
- 相互嵌套,
(())
从上面的格式我们可以知道:
- 对左括号没有要求,只要小于等于n即可。
- 对右括号,任何时候右括号的数目就应该小于等于左括号的数目。
从上面的条件我们构造出dfs即可。
代码
algorithm 1
class Solution {
private:
int n;
vector<string> ans;
public:
bool check(string s) {
stack<char> st;
for (auto c : s) {
if (c == ')') {
if (!st.empty() && st.top() == '(') st.pop();
else return false;
} else {
st.push(c);
}
}
return st.empty() ? true : false;
}
void dfs(string s, int i, int j) {
if (i == n && j == n) {
if (check(s)) ans.push_back(s);
return;
}
if (i < n) {
s.push_back('(');
dfs(s, i + 1, j);
s.pop_back();
}
if (j < n) {
s.push_back(')');
dfs(s, i, j + 1);
s.pop_back();
}
}
vector<string> generateParenthesis(int n) {
this->n = n;
dfs("", 0, 0);
return ans;
}
};
algorithm 2
class Solution {
private:
int n;
vector<string> ans;
public:
void dfs(string s, int i, int j) {
if (i == n && j == n) {
ans.push_back(s);
return;
}
if (i < n) dfs(s + '(', i + 1, j);
if (j < i) dfs(s + ')', i, j + 1);
}
vector<string> generateParenthesis(int n) {
this->n = n;
dfs("", 0, 0);
return ans;
}
};