- 分析
利用回溯解决,有关括号问题,你需要记住两个性质:
1)一个合法括号组合的左括号数量一定等于右括号数量,这个显而易见。
2)对于一个合法的括号字符串组合p,必然对于任何0 <= i < len§都有:子串p[0…i]中左括号的数量都大于或等于右括号的数量。
backtrack函数中参数left是字符串s中左括号的数量,参数right是字符串s中右括号的数量。 - 代码
class Solution {
public:
vector<string> vec;
vector<string> generateParenthesis(int n) {
string s;
backtrack(0, 0, s, n);
return vec;
}
void backtrack(int left, int right, string& s, int n){
if(left < right){
return;
}else if(left == right && left == n){
vec.push_back(s);
return;
}else if(left > n || right > n){
return;
}
for(char c : {')', '('}){
s.push_back(c);
if(c == '('){
left++;
}else{
right++;
}
backtrack(left, right, s, n);
s.pop_back();
if(c == '('){
left--;
}else{
right--;
}
}
}
};