给出 n n n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3 n = 3 n=3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:
1)全排列。将生成的括号所有可能列出,对每一种可能判断其合法性。
class Solution {
public:
vector<char> a;
vector<string> vec;
bool check(string str) {
stack<char> st;
for (int i = 0; i < str.size(); ++i) {
if (str[i] == '(')
st.push(str[i]);
else {
if (st.empty())
return false;
char c = st.top();
if (c == '(') {
st.pop();
} else {
return false;
}
}
}
return st.empty() ? true : false;
}
vector<string> generateParenthesis(int n) {
for (int i = 0; i < n; ++i) {
a.push_back('(');
}
for (int i = 0; i < n; ++i) {
a.push_back(')');
}
do {
string str = "";
for (int i = 0; i < a.size(); ++i) {
str += a[i];
}
//cout << str << " ";
if (check(str))
vec.push_back(str);
} while (next_permutation(a.begin(), a.end())); //生成全排列函数
return vec;
}
};
2) d f s dfs dfs深搜。保证左括号个数与右括号个数匹配,判断左括号小于 n n n个,则添加左括号;判断右括号个数小于左括号个数,则添加右括号;当左括号个数大于 n n n或者右括号个数大于 n n n时,返回;当两个个数为 n n n时,满足要求,将 s t r i n g string string存入 v e c t o r vector vector
class Solution {
public:
vector<string> vec;
vector<string> generateParenthesis(int n) {
generate("", 0, 0, n);
return vec;
}
void generate(string ans, int left, int right, int n) {
if (left > n || right > n)
return;
if (left == n && right == n)
vec.push_back(ans);
if (left < n) {
generate(ans + "(", left + 1, right, n);
}
//保证右括号个数匹配左括号个数
if (right < left) {
generate(ans + ")", left, right + 1, n);
}
}
};