该题可以运用递归解答,,思路就是根据左括号和右括号的匹配来完成。
方法一:该方法思路较为清晰,而且任意理解。
class Solution {
public:
vector<string>res;
vector<string> generateParenthesis(int n) {
dfs(n,n,"");
return res;
}
void dfs(int left,int right,string curStr){
if(left == 0 && right == 0){//当左括号和右括号相等且数目等于n时
res.push_back(curStr);
return;
}
if(left > 0){
dfs(left - 1,right,curStr + "(");//递归加上左括号
}
if(right > left){ //当右括号数目小于左括号时
dfs(left,right - 1,curStr + ")");
}
}
};
方法二:该方法代码较为臃肿,但很任意可以考虑到。思路与上一个基本类似。
class Solution {
bool valid(const string& str) {
int balance = 0;
for (char c : str) {
if (c == '(') {
++balance;
} else {
--balance;
}
if (balance < 0) {
return false;
}
}
return balance == 0;
}
void generate_all(string& current, int n, vector<string>& result) {
if (n == current.size()) {
if (valid(current)) {
result.push_back(current);
}
return;
}
current += '(';
generate_all(current, n, result);
current.pop_back();
current += ')';
generate_all(current, n, result);
current.pop_back();
}
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string current;
generate_all(current, n * 2, result);
return result;
}
};
方法三:较方法二有所改进,代码更加简洁一点
class Solution {
void backtrack(vector<string>& ans, string& cur, int open, int close, int n) {
if (cur.size() == n * 2) {
ans.push_back(cur);
return;
}
if (open < n) {
cur.push_back('(');
backtrack(ans, cur, open + 1, close, n);
cur.pop_back();
}
if (close < open) {
cur.push_back(')');
backtrack(ans, cur, open, close + 1, n);
cur.pop_back();
}
}
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string current;
backtrack(result, current, 0, 0, n);
return result;
}
};